Java/SQLite 批处理和自动提交的澄清

2024-02-21

我从 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(使用前将#替换为@)

Java/SQLite 批处理和自动提交的澄清 的相关文章

随机推荐