我从 SQLite Java 库网站复制了以下示例:
PreparedStatement prep =
conn.prepareStatement("insert into people values (?, ?);");
prep.setString(1, "Gandhi");
prep.setString(2, "politics");
prep.addBatch();
prep.setString(1, "Turing");
prep.setString(2, "computers");
prep.addBatch();
conn.setAutoCommit(false);
prep.executeBatch();
conn.setAutoCommit(true);
我正在努力理解切换的重要性autoCommit()
的任一侧executeBatch()
。它是否仅仅阻止对每个单独的批处理操作进行提交?因此,单个“批量”提交将由setAutoCommit(true)
.
自动提交在批处理之前被禁用,因为启用自动提交将在插入每一行后提交(即等待同步发生,这意味着它将等待数据实际写入硬盘等持久存储)。
如果自动提交为 false,则不会等待同步。
等待sync和不等待的区别在于保证数据是实际到硬盘还是在缓冲区(可以是缓冲IO,也可以是硬盘缓冲区)。
简而言之,禁用自动提交可以提高性能。我认为默认情况下自动提交是启用的。
另一种优化方式
如果您想启用自动提交并且仍然需要性能提升,只需尝试在批处理操作之前作为事务启动并在之后提交事务。这样 sqlite 就不会在每次插入后自动提交它将带来良好的性能提升。
EDIT:
当您启动事务时,您只是禁用自动提交
对于该交易,一旦交易结束,它将再次“开启”。自动提交的帮助是
当您单独插入/更新行(而不是批量)时,您不必启动
显式地为每个插入/更新事务。关于将自动提交设置为 true,之后
事实上,并不要求提交。如果您进行自动提交
true 并且您已经插入/更新的任何内容都不会产生任何效果并且不会具有相同的效果
在进行插入/更新之前保证自动提交为真。
以下是有关加速 Sqlite INSERT 的一些信息。 http://www.sqlite.org/faq.html#q19
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)