首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当Spring JdbcTemplate.batchUpdate()失败时尝试的最佳策略

当Spring JdbcTemplate.batchUpdate()失败时尝试的最佳策略
EN

Stack Overflow用户
提问于 2013-09-30 00:27:46
回答 2查看 4.8K关注 0票数 0

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map<String,Object>[] batchValues = ...;
namedParameterJdbcTemplate.batchUpdate(sql, batchValues);

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

EN

回答 2

Stack Overflow用户

发布于 2013-09-30 02:03:19

我认为有两种可能性,并应根据要求作出决定。

  1. 回滚事务并重试。这取决于异常的类型。如果存在约束冲突异常,则唯一的方法是更正数据并重试操作。这是一个很好的方法,所有或根本不遵循。您确切地知道您是否执行了数据库操作。
  2. batchUpdate为您提供更新计数。AFAIK,您可以安全地将其视为批处理列表中更新的行数。如果jdbc驱动程序不支持批处理更新,spring会自动返回到单语句执行,这可能会产生问题。当操作可重做时,使用此方法更好。
票数 0
EN

Stack Overflow用户

发布于 2020-08-13 19:59:51

你可以得到失败的批次如下..。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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());    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19089624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文