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 - 针对多个表的批量插入的主要内容,如果未能解决你的问题,请参考以下文章