JDBC 批量插入异常处理

2022-09-02 03:53:54

每次执行程序时,我都会执行JDBC批处理插入(一次插入大约1000行)。但是我无法正确处理某些记录引发的异常。

假设 1000 条记录中的第 100 条记录由于数据无效或某个值的大小超过列大小而引发异常。发生异常后,不会插入剩余的记录,并且程序在两者之间失败。

我想要的是,即使第100条记录抛出异常,剩余的插入也应该在我的程序结束之前像往常一样发生。

我无法理解如何实现这一目标。请建议。

编辑:

下面是我在应用中用于批量插入的示例代码。假设结果集有大约 1000 条记录。

PreparedStatement ps = null;
while(rs.next()){
  //Retrieve the value and set it to a Prepared statement

  String name = rs.getString("Name");
  int age = rs.getInt("Age");
  ps.setInt(1, age);
  ps.setString(2, name);

  //Finally invoke addBatch
  ps.addBatch();
}

//Finally call the executeBatch method
ps.executeBatch();

如果第 100 条记录引发异常,则我只想从第 100 条记录触发该进程。有没有办法做到这一点,这样我就可以从引发异常的记录重新启动进程,直到再次结束?如何做到这一点?


答案 1

您声明您正在执行批量的SQL语句,因此我假设您正在使用.当您使用一批语句时,某些语句可能会成功,而某些语句可能会失败。如果一个语句失败,这并不意味着 JDBC 驱动程序回滚成功的语句。JDBC 驱动程序可以选择在一个语句失败时尝试执行批处理中的所有语句,或者它可能会选择在语句失败后立即停止执行批处理中的语句(听起来您使用的驱动程序选择在失败后立即停止执行语句)。executeBatchexecuteBatch

当批处理中的一个语句失败时,应得到一个 .在异常处理程序中,需要调用 。这将为您提供一个数组,告诉您语句更新了多少行,指示语句成功但没有可用的行计数,或指示语句失败。如果前 99 个语句成功,则第 100 个语句生成错误,并且不执行其余语句,则应返回一个 100 元素数组,其中前 99 个元素表示成功,第 100 个元素指示 。然后,您的代码将需要重试那些未执行的语句(在本例中为语句 101-1000)。BatchUpdateExceptiongetUpdateCountsintStatement.SUCCESS_NO_INFOStatement.EXECUTE_FAILEDStatement.EXECUTE_FAILED


答案 2

在没有看到任何代码的情况下,我能给出的最好的建议是在执行插入的代码周围包装一个try/catch块。您可能还需要在每次插入时提交插入(假设是事务连接)。这将导致处理速度稍慢,但会允许程序继续。

我认为更干净的方法是尝试在插入之前预先验证记录。如果我们一次只谈论1000条记录,这不应该是太多的处理负载。


推荐