Spring JDBC - 针对多个表的批量插入

Posted

技术标签:

【中文标题】Spring JDBC - 针对多个表的批量插入【英文标题】:Spring JDBC - Bulk insert targeting multiple tables 【发布时间】:2013-04-27 10:03:29 【问题描述】:

使用 JDBC (Oracle),我需要将数千行插入到三个不同的表中。基本上,我想在一个循环中一个接一个地执行 3 个插入 SQL 语句。

我阅读了this link,我想知道哪个实现更好(就执行时间而言):

    批量执行第一条SQL语句,取回生成的key 使用步骤 1 中生成的密钥批量执行第二条 SQL 语句并检索新生成的密钥 使用第 1 步和第 2 步生成的键执行第三条 SQL 语句

或循环遍历每条记录以插入,并为每条记录一个接一个地执行 3 个 SQL 语句。

我知道第一个实现是依赖于数据库的(因为不是每个数据库都支持ResultSet.getGeneratedKeys())。也许还有第三种我没有想到的实现方式?

我想使用单个连接,因此,对于这两种实现,我将首先获得一个连接,执行每个插入操作,最后提交并关闭连接。

另外,我想知道我是否可以使用任何 Spring JDBC 抽象。 Spring JdbcTemplace 的第二个实现似乎是可能的(用@Transactional 包装方法以使用相同的连接)但第一个看起来很困难,因为 JdbcTemplate 的方法 batchUpdate 不返回生成的密钥。

【问题讨论】:

【参考方案1】:

如果执行时间不是问题,我会选择第二种方式。它不易出错,更容易被其他同事阅读。此外,您可以更好地控制交易。例如,您可以在 3 次插入完成后提交。

对于第一种方式:绕过GeneratedKeys问题,您可以在第一组INSERTs之后创建SELECT并获取ID(GeneratedKeys),然后使用检索到的第二组插入ID 等等……但我认为这很混乱。

也可以考虑使用存储过程

【讨论】:

以上是关于Spring JDBC - 针对多个表的批量插入的主要内容,如果未能解决你的问题,请参考以下文章

JDBC批量插入性能简单分析

java 如何批量插入数据

如何在spring boot jdbc中从具有批量大小的多个表中执行批量删除

Spring Boot JPA 批量插入

在C#中完成海量数据的批量插入和更新

193 - 禁用批量插入和安全脚本