Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java高效地创建大量数据并将其导入SQLite数据库_Java_Sqlite - Fatal编程技术网

从Java高效地创建大量数据并将其导入SQLite数据库

从Java高效地创建大量数据并将其导入SQLite数据库,java,sqlite,Java,Sqlite,在一个过程中,在使用Java的服务器端,我必须创建一个SQLite数据库并导入大量数据(1.200.000行分为3个表),然后让用户下载生成的数据库 我的第一种方法是在内存中创建SQLite数据库,执行所有插入,最后将数据库保存到磁盘。它能工作,但速度很慢。它最多需要42秒 第一个改进是定义一个事务。如果我不定义事务,SQLite会为每个插入创建一个事务,这很慢。只为所有客户执行一个事务,大约需要30秒。这对于我们的案件来说是不够的 第三种方法是执行相同的操作,但不是调用executeUpda

在一个过程中,在使用Java的服务器端,我必须创建一个SQLite数据库并导入大量数据(1.200.000行分为3个表),然后让用户下载生成的数据库

  • 我的第一种方法是在内存中创建SQLite数据库,执行所有插入,最后将数据库保存到磁盘。它能工作,但速度很慢。它最多需要42秒

  • 第一个改进是定义一个事务。如果我不定义事务,SQLite会为每个插入创建一个事务,这很慢。只为所有客户执行一个事务,大约需要30秒。这对于我们的案件来说是不够的

  • 第三种方法是执行相同的操作,但不是调用executeUpdate逐个执行每个插入,而是创建一个包含所有插入的StringBuffer,并使用一个对executeUpdate的调用将它们一起发送。这稍微快一点,但只有2或3秒

当我认为没有任何方法可以更快地完成时,我意识到使用sqlite命令行工具,我可以执行“.import csv_file tablename”,它可以更快地导入数据,因此我可以将数据导出到csv文件,然后使用该工具导入它们。然而,我更希望不必从Java代码调用任何命令行工具,但我还没有找到任何方法来使用JDBC驱动程序执行相同的导入。因此,我的问题是:

  • 您知道有什么方法可以像命令行工具从Java代码中导入CSV一样进行导入吗

  • 您是否有更好的方法来创建SQLite数据库并以高效的方式导入大量数据

编辑:代码和SQLite架构:

我无法显示完整的架构定义,但创建了3个表,如下所示:

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来执行所有插入,并尽可能地重用它


1。显示您的Java代码。2.显示你的SQLite模式。谢谢,我已经更新了答案。嗯。。。有时候我不理解一些stackoverflow的贡献者。。。为什么这个问题会被否决?我想知道改进它的原因。谢谢我不明白为什么这会导致投票率下降。使用一个预先准备好的语句在每个表中插入一行。你是对的,它极大地提高了速度。