【问题标题】:BatchUpdateException: the batch will not terminateBatchUpdateException:批处理不会终止
【发布时间】:2011-06-11 03:08:09
【问题描述】:

我有一个应用程序可以处理一个非常大的文件并将数据发送到 oracle 数据库(使用 Java 6、oracle 9)。

在一个循环中,我使用PreparedStatement ps 并创建使用ps.addBatch() 生成的所有SQL 语句。

我遇到BatchUpdateException bueps.executeBatch() 期间被抛出的情况。此时,批处理停止执行。

我希望批处理继续执行,以便我可以在 processUpdateCounts(bue.getUpdateCounts()) 方法中检查失败的更新。

关于类 BatchUpdateException 的 javadoc 说:

在批量更新命令后 未能正确执行并且 抛出 BatchUpdateException, 司机可能会也可能不会继续 处理剩下的命令 批处理。

有没有办法强制执行,还是我需要更改我的程序以便它单独执行语句?

【问题讨论】:

    标签: java oracle jdbc exception-handling


    【解决方案1】:

    Oracle 本身可以,看这里:http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14250/oci04sql.htm#sthref616

    然而,这个功能似乎没有暴露给 JDBC,甚至在 oracle 特定的类中也没有。

    由于相当无用的 JDBC 错误处理(“驱动程序可能会或可能不会继续”),我总是在批处理之前设置一个保存点,并在出错时执行回滚到该点。据我所知,这是在 Oracle 批处理错误之后建立已知状态的唯一符合 JDBC 的方法。

    【讨论】:

      【解决方案2】:

      有一种解决方法可以让您使用批处理功能。您可以执行一个 PL/SQL 块来适当地处理错误,而不是执行简单的 INSERT 语句:

      BEGIN
         INSERT INTO your_table VALUES (?,?,...?);
      EXCEPTION
         WHEN OTHERS THEN
            /* deal with the error. For example, log the error id and error msg 
               so that you can list them after the batch */
            INSERT INTO error_table VALUES (?, sqlerrm);
      END
      

      性能应该与批量插入相当(应该比单独执行语句要快)。您还可以调用存储过程而不是 PL/SQL 块。

      【讨论】:

        【解决方案3】:

        刚刚找到这个链接: JDBC Batch Update Problem

        显然,它说有

        没有办法使用 ORACLE BATCH JDBC 在第一次失败后继续

        因此,我将一一发送插入内容。 谢谢

        (很抱歉之前没有找到上面的链接)。

        【讨论】:

          【解决方案4】:

          由于规范似乎没有强制要求(Javadoc 清楚地表明了这一点),任何“强制”延续都必须在每个驱动程序的基础上完成。一个简单的符合标准的解决方法是检查 getUpdateCounts() 返回的数组并为那些失败的语句“重新运行”批处理。您可以通过输入重试次数的逻辑来使这种方法更加复杂。

          当然,这看起来有点混乱(跟踪添加的“批次”,然后检查输出),但适用于所有数据库和驱动程序实现。只是一个想法......

          【讨论】:

            猜你喜欢
            • 2017-04-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-17
            相关资源
            最近更新 更多