jdbc 批量插入和查询与使用生成键的单次插入

Posted

技术标签:

【中文标题】jdbc 批量插入和查询与使用生成键的单次插入【英文标题】:jdbc batch insert and query vs single inserts with gernerated key 【发布时间】:2011-06-14 11:50:41 【问题描述】:

我想在自动生成键的表中插入很多行。 JDBC 不保证获取生成的密钥对批量更新有效。

It is implementation-defined as to whether getGeneratedKeys will return generated values after invoking the executeBatch method.(JDBC 4.0 规范 2006,第 135 页)。

我有两个选择。分别插入每一行,得到key。或者批量插入,然后查询key。

为了避免查询多个键的往返,我可以使用这种方法here。有例如5个不同大小的准备好的语句。然后将我的“批量查询”分解成尽可能小的语句。

更快的方法是什么?

【问题讨论】:

【参考方案1】:

视情况而定。

我不知道executeBatch() 是否比反复使用PreparedStatement 更快,所以我的建议是:

    试试getGeneratedKeys() 是否适用于您的 JDBC 驱动程序。如果它不起作用,那么批处理插入对您也不起作用。

    为两者编写测试用例并测量性能。这为您提供了真实的数据来做出决定。其他一切都只是猜测(90% 的时候都是错误的)。

[编辑]如果您想让您的应用程序数据库不可知,请将测试添加到您的应用程序并在临时/测试表上运行它。如果测试成功,则选择使用批量更新的实现,否则回退到暴力破解。

【讨论】:

哦,我虽然 getGeneratedKeys() 是驱动程序必须的,但它不是。如果可能的话,我想保持应用程序数据库的独立性。

以上是关于jdbc 批量插入和查询与使用生成键的单次插入的主要内容,如果未能解决你的问题,请参考以下文章

批量插入的 Redshift 查询队列使用情况

批量 MySQL 插入,一个主记录,一个带有外键的详细记录

使用 JDBC 进行批量插入的有效方法

jdbc 批量插入数据,多少条批量插入效率最高

Mybatis批量插入返回自增主键(转)

JDBC 批量插入,返回 ID