当前位置: 首页 > 工具软件 > SpatiaLite > 使用案例 >

springboot项目连接 SpatiaLite spatialite-jdbc spatialite4-jdbc的简单使用和优化

甄永年
2023-12-01

spatialite 是sqlite的空间扩展,spatialite-jdbc 是java驱动

githup 地址 https://github.com/benstadin/spatialite4-jdbc

由于项目需要,临时接触了一下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 遇到问题

1.3.1 添加空间字段无效

原因是使用了 executeBatch 执行,而不是使用 executeQuery 执行
添加字段sql是:
SELECT AddGeometryColumn(‘PointTable’, ‘Geometry’, 4326, ‘POINT’, ‘XY’);
实际是执行查询操作,因此用execute不起作用,改为executeQuery即可

1.3.2 数据库连接很慢

原因是执行 InitSpatialMetaData 的时候调用无参函数,改为使用传参1即可。
具体原因未知,大概是初始化空间元数据太多导致。

//stat.execute("SELECT InitSpatialMetaData()");
stat.execute("SELECT InitSpatialMetaData(1)");

最后,经同事指点,建议使用 ThreadLocal 管理数据源和数据库文件。

参考博客: InitSpatialMetaData()速度慢的问题

 类似资料: