Я пытаюсь загрузить 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;
}
}