SQLite метод load_extension, вызывающий дамп ядра при выполнении в Java на Mac - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь загрузить Spatialite в SQLite в Java программе, работающей на macOS Catalina. Когда я пытаюсь выполнить оператор SELECT load_extension('mod_spatialite'), программа падает с дампом ядра. SQLite 3.31.1 устанавливается через Brew. Я также изменил свою переменную среды PATH (через .profile), чтобы вывести список версий, установленных через Brew, до версии, встроенной в ОС. Мне нужно было сделать так, чтобы при запуске sqlite3 из командной строки открывалась версия, для которой не было отключено load_extension.

Вот мой код. Аргумент командной строки - это путь к файлу .sqlite:

import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import org.sqlite.JDBC;
import org.sqlite.SQLiteConfig;

public class Spatialite
{
    public static void main(String[] args)
    {
        File file = new File(args[0]);
        Connection conn = connect(file);
    }

    protected static Connection connect(File dbPath)
    {
        Connection conn = null;
        try
        {
            // enabling dynamic extension loading
            // absolutely required by SpatiaLite
            SQLiteConfig config = new SQLiteConfig();
            config.enableLoadExtension(true);
            config.setReadOnly(true);
            config.setSharedCache(true);

            // db parameters
            String url = "jdbc:sqlite:" + dbPath.getAbsolutePath();

            // create a connection to the database
            JDBC jdbc = (JDBC) Class.forName("org.sqlite.JDBC").newInstance();

            conn = jdbc.connect(url, config.toProperties());

            Statement stmt = conn.createStatement();
            stmt.setQueryTimeout(30);
            // loading SpatiaLite
            stmt.execute("SELECT load_extension('mod_spatialite')");
            stmt.close();
        } catch (SQLException | ClassNotFoundException | IllegalAccessException | InstantiationException e)
        {
            System.out.println(e.getMessage());
        } catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
        return conn;
    }
}
...