JDBC批量插入异常处理

use*_*944 20 java sql oracle jdbc oracle10g

我每次执行程序时都在执行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();
Run Code Online (Sandbox Code Playgroud)

如果第100条记录抛出异常,那么我想仅从第100条第1000条记录触发该进程.是否有某种方式来做到这一点,这样我可以重新开始从中抛出异常的记录过程中直到再次结束了吗?怎么做到这一点?

Jus*_*ave 27

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

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


Mik*_*ark 0

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

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