我想在一个自动生成键的表中插入很多行。JDBC不能保证获取生成的密钥将在批量更新中起作用。
It is implementation-defined as to whether getGeneratedKeys will return
generated values after invoking the executeBatch method.
(JDBC 4.0规范2006,第135页)。
我有两个选择。分别插入每一行并获取密钥。或者进行批量插入,然后查询密钥。
为了避免查询多个键的往返,我可以在这里使用这种方法。有5个不同大小的陈述。然后将我的"批处理查询"分解为尽可能小的语句。
什么是更快的方法?
这取决于情况。
我不知道executeBatch()
是否真的比重复使用PreparedStatement
更快,所以我的建议是:
-
尝试
getGeneratedKeys()
是否适用于JDBC驱动程序。如果它不起作用,那么批量插入无论如何都不适用。 -
为两者编写一个测试用例,并测量性能。这为你的决策提供了真实的数据。其他一切都只是猜测(90%的时候都是错误的)。
[EDIT]如果您想保持应用程序数据库不可知,请将测试添加到应用程序中,并在临时/测试表上运行。如果测试成功,请选择一个使用批处理更新的实现,否则请使用暴力。