Spring JdbcTemplate batchUpdate处理异常
目前我们的代码使用JdbcTemplate的batchUpdate方法进行批插入 我的问题是,如果其中一个更新中出现任何异常,如何处理它(假设只是通过添加日志)并继续执行下一个更新sql语句 还有JdbcTemplate的batchUpdate()方法如何处理异常 这里是一个片段Spring JdbcTemplate batchUpdate处理异常,spring,jdbc,jdbctemplate,spring-jdbc,batch-updates,Spring,Jdbc,Jdbctemplate,Spring Jdbc,Batch Updates,目前我们的代码使用JdbcTemplate的batchUpdate方法进行批插入 我的问题是,如果其中一个更新中出现任何异常,如何处理它(假设只是通过添加日志)并继续执行下一个更新sql语句 还有JdbcTemplate的batchUpdate()方法如何处理异常 这里是一个片段 /** * Saves the list of <code>Item</code> objects to the database in a batch mode *
/**
* 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()方法如何处理异常
批更新行为是:
如果批处理更新中的某个命令无法正确执行,此方法将抛出BatchUpdateException,JDBC驱动程序可能会也可能不会继续处理批处理中的其余命令
您应该使用DBMS检查此行为
无论如何,BatchUpdateException
将被spring捕获,并在一些清理之后作为RuntimeException重新启动(请参阅实现细节)
所有这些逻辑都将与事务交织在一起-例如,如果插入在事务边界内,并且您通过事务边界重新调用RuntimeException
-事务(以及所有成功插入的事务)将回滚
因此,如果不进一步了解DBMS及其JDBC驱动程序在批插入过程中的错误行为,就无法有效地实现所需的“仅记录错误行”批处理逻辑。我遇到了与spring JDBC相同的问题,即在出现任何错误记录时停止插入,并且不继续插入。 以下是我的工作:-
// divide the inputlist into batches and for each batch :-
for (int j = 0; j < resEntlSize; j += getEntlBatchSize()) {
final List<ResEntlDTO> batchEntlDTOList = resEntlDTOList
.subList(
j,
j + getEntlBatchSize() > resEntlSize ? resEntlSize
: j + getEntlBatchSize());
TransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager
.getTransaction(def);
try {
//perform batchupdate for the batch
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
//perform single update for the error batch
}
}
//将输入列表分为多个批次,每个批次:-
对于(int j=0;jRecentlSize?RecentlSize
:j+getEntlBatchSize());
TransactionDefinition def=新的DefaultTransactionDefinition();
TransactionStatus状态=transactionManager
.getTransaction(def);
试一试{
//对批执行批更新
transactionManager.commit(状态);
}捕获(例外e){
transactionManager.rollback(状态);
//对错误批执行单个更新
}
}
处理批量更新中的错误并不容易,而且没有一种解决方案。这取决于您想如何处理它。@skaffman您知道处理Spring批处理更新错误的方法吗?当使用异常转换时,第一次遇到的异常似乎被转换并抛出,因此返回的更新计数丢失。这很奇怪。