Java BatchUpdateException:批处理不会终止
我有一个应用程序,它处理一个非常大的文件,并将数据发送到oracle数据库(使用Java 6、oracle 9) 在循环中,我使用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())中
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的方法