Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring JdbcTemplate batchUpdate处理异常_Spring_Jdbc_Jdbctemplate_Spring Jdbc_Batch Updates - Fatal编程技术网

Spring 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 *

目前我们的代码使用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()方法如何处理异常

批更新行为是:

如果批处理更新中的某个命令无法正确执行,此方法将抛出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批处理更新错误的方法吗?当使用异常转换时,第一次遇到的异常似乎被转换并抛出,因此返回的更新计数丢失。这很奇怪。