java - JDBC批量插入异常处理

标签 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();

如果第 100 条记录抛出异常,那么我只想从第 100 条和第 1000 条记录触发该过程。有没有办法做到这一点,以便我可以从抛出异常向前的记录重新启动该过程,直到再次结束?如何做到这一点?

最佳答案

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

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

关于java - JDBC批量插入异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11298220/

相关文章:

java.lang.NoSuchFieldError : REFLECTION While deploying on Tomcat 7. 0.78

MySQL : ERROR 1215 (HY000): Cannot add foreign key constraint

sql - oracle SQL 上的条件求和

sql - oracle 中报告表的数据馈送(汇总与分组集)

java条件快捷方式

java - 什么是分组通量以及我们如何使用分组通量?

java - 读取文件行并存储不同类型的变量

mysql - SQL GROUP CONCAT 和 LEFT JOIN 仅从数据库返回一个结果

mysql - 限制一周中的某些特定日期?

java - 从 Oracle 表加载和更新 Gemfire 缓存