【发布时间】:2018-05-11 12:28:13
【问题描述】:
阅读了很多东西,比如这里: SQLite queries much slower using JDBC than in Firefox SqliteManager plugin
但我不知道有什么问题。 情况是,我有一个 SQLite 数据库(来自 Android 平板电脑)和一个不太大的表(其中约 50.000 行) 例如,如果我在 Sqlite Manager 中运行“select * from table”,则需要 0.11 秒,正确。
但是...如果我在 Java 程序(使用 SQLite JDBC)中执行此操作,则需要 20 分钟!!!不开玩笑。
有人(某处)说这取决于版本。 但我的问题是怎么做?
因为这个命令:“SELECT sqlite_version()”在每种情况下都会在同一个 .db 文件上给出不同的结果:
- 在一个非常古老的 sqlite 管理器中,它提供 3.6.19
- 在 Sqlite Studio 3.15 中
- 并与来自 sqlite.org 的最新 .exe 一起提供 3.23.1 所以这不是数据库相关的东西,我认为是使用的sqlite3.exe的版本。
我可以整天更改 JDBC 驱动程序(我做过几次),但我怎么知道我需要哪个?
有人有什么想法吗?我完全被它困住了。
编辑: 好的,JDBC jar 来自这里:https://bitbucket.org/xerial/sqlite-jdbc/downloads/
而且我的代码真的很基础,一开始我只是想测量一下速度。
Class.forName("org.sqlite.JDBC");
Connection c1 = DriverManager.getConnection("jdbc:sqlite:" + "c:\\database.db");
PreparedStatement stmt1 = c1.prepareStatement("select * from table1;");
ResultSet rs = stmt1.executeQuery();
String script = "insert into table1 values ";
while (rs.next()) {
script += "(";
script += rs.getInt(1) + ", '" + rs.getString(2) + "', '" + rs.getString(3) + "'";
script += "),";
}
stmt1.close();
c1.close();
executeQuery() 行需要 20 分钟。
【问题讨论】:
-
请添加相关的java代码,执行查询需要20分钟。
-
这种性能差异绝对不是(仅)与 JDBC API 相关的。可能是一个特定的驱动程序错误,但您没有确切提到您一直在使用什么驱动程序,也没有提到您运行 JDBC 逻辑的执行环境,也没有显示任何代码,这是重现此问题所需要的
-
我们没有玻璃球...我们无法知道问题出在您的代码中还是在驱动程序/库/sqlite 版本中。
-
好吧,您正在比较在 SQLite 管理中完成的
Select与插入到表中的代码(使用String连接)。首先,使用PreparedStatement.addBatch()插入每一行(检查SQLITE 中是否管理批处理)。然后,不要连接 yoruString。 -
Axel,没有实际的插入,我只是构建了一个未执行的字符串。 (其实我做到了,几秒钟就完成了,但问题出在上面那部分代码上)