Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BatchUpdateException:批处理不会终止_Java_Oracle_Jdbc_Exception Handling - Fatal编程技术网

Java BatchUpdateException:批处理不会终止

Java BatchUpdateException:批处理不会终止,java,oracle,jdbc,exception-handling,Java,Oracle,Jdbc,Exception Handling,我有一个应用程序,它处理一个非常大的文件,并将数据发送到oracle数据库(使用Java 6、oracle 9) 在循环中,我使用PreparedStatement ps并创建使用ps.addBatch()生成的所有SQL语句 我遇到的情况是,在ps.executeBatch()期间,在某个地方抛出了BatchUpdateException bue。此时,批处理停止执行 我希望批处理继续执行,这样我就可以在方法processUpdateCounts(bue.getUpdateCounts())中

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

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

我遇到的情况是,在
ps.executeBatch()
期间,在某个地方抛出了
BatchUpdateException bue
。此时,批处理停止执行

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

关于BatchUpdateException类的javadoc说明:

在批处理更新中的命令之后 未能正确执行,并且 将抛出BatchUpdateException, 驱动程序可能继续,也可能不继续 处理中的其余命令 一批


有没有一种方法可以强制执行延续,或者我需要修改我的程序,使其能够单独执行语句?

由于规范似乎没有强制执行延续(正如Javadoc所清楚显示的那样),任何“强制”延续都必须按驱动程序执行。一个简单的符合标准的解决方法是检查
getUpdateCounts()
返回的数组,并为失败的语句“重新运行”批处理。通过输入重试次数的逻辑,可以使这种方法更复杂一些

当然,这看起来有点混乱(跟踪添加的“批处理”,然后检查输出),但可以跨所有数据库和驱动程序实现工作。只是一个想法…

刚刚找到此链接:

显然,上面说有

在第一次失败后,ORACLE批处理JDBC无法继续进行

因此,我不得不一个接一个地发送插页。 多谢各位


(很抱歉,以前没有更好地找到上面的链接)。

有一个解决方法,允许您使用批处理功能。您可以执行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块。

Oracle本身可以,请参见此处:

然而,这项功能似乎并没有向JDBC公开,甚至在oracle特定的类中也没有

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