由于项目需要,临时接触了一下spatialite,网上示例太少,遇到一些问题,现在简单整理一下用法和问题。
1.1 安装jar包
使用版本为 ,目前maven没有资源,因此需要手动导入,执行maven命令
mvn install:install-file -Dfile=C:\Users\test\Desktop\spatialite-jdbc-4.3.0a.jar -DgroupId=org.hdm -DartifactId=spatialite-jdbc -Dversion=4.3.0a -Dpackaging=jar
pom中引用
<dependency>
<groupId>org.hdm</groupId>
<artifactId>spatialite-jdbc</artifactId>
<version>4.3.0a</version>
</dependency>
1.2 初始化,参照githup示例
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class Spatialite
{
public static Connection getConnection(Properties prop) throws SQLException {
String property = System.getProperty("java.io.tmpdir");
//注意,template.db为项目模板
return DriverManager.getConnection("jdbc:spatialite:/" + property + "/template.db", prop)
}
public static void main(String[] args)
{
Properties prop = new Properties();
prop.setProperty("enable_shared_cache", "true");
//开启扩展
prop.setProperty("enable_load_extension", "true");
//开启空间拓展
prop.setProperty("enable_spatialite", "true");
Connection conn = null;
try {
conn = getConnection(prop);
Statement stat = conn.createStatement();
//注意,这里的初始化方法,需要传参 1,具体原因未明,
//如果按照githup示例,无参调用,会很慢。
stat.execute("SELECT InitSpatialMetaData(1)");
stat.close();
//此sql可以选择不执行
//stat = conn.createStatement();
//ResultSet rs = stat.executeQuery("SELECT * FROM geometry_columns");
//stat.close();
if (conn != null)
conn.close();
}
catch (SQLException e) {
e.printStackTrace();
}
}
}
1.3 遇到问题
原因是使用了 executeBatch 执行,而不是使用 executeQuery 执行
添加字段sql是:
SELECT AddGeometryColumn(‘PointTable’, ‘Geometry’, 4326, ‘POINT’, ‘XY’);
实际是执行查询操作,因此用execute不起作用,改为executeQuery即可。
原因是执行 InitSpatialMetaData 的时候调用无参函数,改为使用传参1即可。
具体原因未知,大概是初始化空间元数据太多导致。
//stat.execute("SELECT InitSpatialMetaData()");
stat.execute("SELECT InitSpatialMetaData(1)");
最后,经同事指点,建议使用 ThreadLocal 管理数据源和数据库文件。