0

以下代码使用JdbcTemplate.batchUpdate()将行插入数据库;

Map<String,Object>[] batchValues = ...;
namedParameterJdbcTemplate.batchUpdate(sql, batchValues);

失败时,会引发 DataAccessException。无论如何,我看不到确定哪些行(即地图中的条目)有问题并导致异常。目前,当抛出这样的异常时,我们只是尝试独立地插入每一行。有更好的方法吗?谢谢

4

2 回答 2

0

我看到两种可能性,应该根据要求做出决定。

  1. 回滚事务并重试。这取决于异常的类型。如果出现约束违例异常,那么唯一的办法就是更正数据并重试操作。这是一个很好的方法,可以遵循全部或不遵循。您确切地知道您是否完成了数据库操作。
  2. batchUpdate 为您提供更新计数。AFAIK,您可以放心地将其视为批处理列表中更新的行数。当 jdbc 驱动程序不支持批量更新时,这可能会出现问题,spring 会自动回退到单语句执行。当操作可重做时,最好使用此方法。
于 2013-09-30T10:03:19.757 回答
0

你可以得到失败的批次,如下所示......

try {
    this.jdbCtemplate.batchUpdate(QueryConstant.SAVE_USER_NOTIFICATION, batchValues.toArray(new Map[usersResponse.size()]));
} catch (DataAccessException e) {
    int[] updateCounts = ((BatchUpdateException) e.getCause()).getUpdateCounts();
    int count = 1;
    for (int i : updateCounts) {
       if (i == Statement.EXECUTE_FAILED) {
          failedBatch.add(count);
       }
       count++;
    }
    logger.info("Batch {} failed out of {} ",failedBatch, usersResponse.size());    }
于 2020-08-14T03:59:51.847 回答