【问题标题】:JDBC Batch insert exception handlingJDBC批量插入异常处理
【发布时间】:2012-07-03 03:15:30
【问题描述】:

每次执行我的程序时,我都会执行 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 条记录触发该过程。有没有办法做到这一点,以便我可以从抛出异常向前的记录重新启动该过程,直到再次结束?如何做到这一点?

【问题讨论】:

    标签: java sql oracle jdbc oracle10g


    【解决方案1】:

    您声明您正在执行批量 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)。

    【讨论】:

    • 对我的原始帖子有任何建议/帮助吗?
    【解决方案2】:

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

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

    【讨论】:

    • 对我的原始帖子有任何建议/帮助吗?
    猜你喜欢
    • 2014-05-05
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2011-02-28
    相关资源
    最近更新 更多