2013-09-30 300 views
0

以下代码使用JdbcTemplate.batchUpdate()将行插入到数据库中;Spring JdbcTemplate.batchUpdate()失败时尝试的最佳策略

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

当它失败时,抛出DataAccessException。 我仍然无法确定哪些行(即地图中的条目)存在问题并导致异常。目前,当抛出这样的异常时,我们试图单独插入每一行。有更好的方法吗? 谢谢

回答

0

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

  1. 回滚事务,然后重试。这取决于异常的类型。如果存在违反约束条件的异常,则只能纠正数据并重试该操作。 这是一个很好的方法,其中全部或者不遵循。您完全知道您是否完成了数据库操作。
  2. batchUpdate为您提供更新计数。 AFAIK,您可以放心地将其视为在批次列表中更新的行数。当jdbc驱动程序不支持批量更新时,这可能会有问题,弹簧会自动回退到单个语句执行。当操作可重用时,此方法更适合使用。
+0

问题是,据我所看到的,batchUpdate()只会在batch实际完成时为批处理中的每个操作返回一个更新计数 - 否则抛出DataAccessException,并且无法容易地识别哪个'行'是有问题的。如果有某种方法来识别这些,那将是非常棒的。 – user1052610

+0

DataAccessException应该包含原因,它应该是一个'java.sql.BatchUpdateException',您可以从中检索更新计数(当由基础JDBC提供程序设置时)。 –