目前我们的代码使用JdbcTemplate的batchUpdate方法来进行批量插入。
我的问题是,如果其中一个更新出现任何异常,如何处理它(假设仅通过添加日志)并继续下一个更新 sql 语句?
另外 JdbcTemplate 的 batchUpdate() 方法如何处理异常?
片段在这里。
/**
* Saves the list of <code>Item</code> objects to the database in a batch mode
*
* @param objects
* list of objects to save in a batch mode
*/
public void save(final List<Item> listOfItems) {
for (List<Debit> list : listOfItems) {
getJdbcTemplate().batchUpdate(insertItem, new ItemBatchPreparedStatementSetter(list));
}
}
JdbcTemplate的batchUpdate()方法如何处理异常?
批量更新行为是JDBC 中未定义 http://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html#executeBatch%28%29:
如果批量更新中的命令之一无法正确执行,则此方法将引发 BatchUpdateException,并且 JDBC 驱动程序可能会也可能不会继续处理该批处理中的其余命令。
您应该使用 DBMS 检查此行为。
Anyway, BatchUpdateException
将被 spring 捕获并在一些清理后作为 RuntimeException 重新抛出(请参阅实现细节here https://github.com/SpringSource/spring-framework/blob/3.1.x/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java#L591).
所有这些逻辑都将与交易交织在一起 - 例如如果插入在事务范围内并且您重新抛出RuntimeException
通过事务边界 - 事务(以及所有成功的插入)将被回滚。
因此,如果没有额外了解 DBMS 及其 JDBC 驱动程序在批量插入期间发生错误的行为,则无法有效实现所需的“仅记录错误行”批处理逻辑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)