从Java高效地创建大量数据并将其导入SQLite数据库
在一个过程中,在使用Java的服务器端,我必须创建一个SQLite数据库并导入大量数据(1.200.000行分为3个表),然后让用户下载生成的数据库从Java高效地创建大量数据并将其导入SQLite数据库,java,sqlite,Java,Sqlite,在一个过程中,在使用Java的服务器端,我必须创建一个SQLite数据库并导入大量数据(1.200.000行分为3个表),然后让用户下载生成的数据库 我的第一种方法是在内存中创建SQLite数据库,执行所有插入,最后将数据库保存到磁盘。它能工作,但速度很慢。它最多需要42秒 第一个改进是定义一个事务。如果我不定义事务,SQLite会为每个插入创建一个事务,这很慢。只为所有客户执行一个事务,大约需要30秒。这对于我们的案件来说是不够的 第三种方法是执行相同的操作,但不是调用executeUpda
- 我的第一种方法是在内存中创建SQLite数据库,执行所有插入,最后将数据库保存到磁盘。它能工作,但速度很慢。它最多需要42秒
- 第一个改进是定义一个事务。如果我不定义事务,SQLite会为每个插入创建一个事务,这很慢。只为所有客户执行一个事务,大约需要30秒。这对于我们的案件来说是不够的
- 第三种方法是执行相同的操作,但不是调用executeUpdate逐个执行每个插入,而是创建一个包含所有插入的StringBuffer,并使用一个对executeUpdate的调用将它们一起发送。这稍微快一点,但只有2或3秒
- 您知道有什么方法可以像命令行工具从Java代码中导入CSV一样进行导入吗
- 您是否有更好的方法来创建SQLite数据库并以高效的方式导入大量数据
CREATE VIRTUAL TABLE xxxxx USING rtree(...) with 5 attributes.
CREATE VIRTUAL TABLE xxxxx USING fts3 (...) with 1 attribute.
CREATE TABLE poidata(xxxxx) with 15 attributes.
表之间没有任何外键,除了PKs之外没有任何索引
关于代码,它很简单。我在StringBuffer中生成所有插入,最后执行:
Statement st = this.getConnection().createStatement();
st.execute("begin transaction");
st.executeUpdate(sql.toString());
st.execute("end transaction");
st.executeUpdate("backup to " + destination.getAbsolutePath());
我目前正在使用Xerial SQLite JDBC驱动程序。经过一些优化后,现在生成数据库大约需要15秒。经过所有的研究和测试,最重要的是:
- 对所有插入只使用一个事务,并且必须明确声明该事务。如果未声明,默认情况下,它会为每个插入创建一个新事务
- 创建一个且仅一个PreparedStatement来执行所有插入,并尽可能地重用它