部分失败时的执行行为

时间:2015-06-16 12:04:33

标签: java oracle jdbc batch-processing

我有一个java 1.6应用程序,它使用批量插入来使用jdbc驱动程序在Oracle数据库中插入记录。正如您在Statement对象上所知,有一个名为executeBatch()的方法,我们将其用于批量更新。它有一个返回类型的int数组,其中包含每个记录的执行结果。但它也会在出现错误时抛出BatchUpdateException,我们也可以从中获取结果int数组。我的问题是在什么错误情况下我应该期待BatchUpdateException,当我应该期望没有抛出异常但是对于某些记录我得失败。

注意:问题特别针对Oracle JDBC。 为了更清楚,我已经看到在执行executeBatch()之后的情况我没有得到BatchUpdateException,但是一些insert语句失败了。我的问题是关于可能发生的情况?

这是Statement.executeBatch()方法的返回javadoc。根据这里的一般意见,当一个条目失败时,执行抛出BatchUpdateException然后在哪种情况下我们可以预期返回数组中的某些条目失败。

      * @return an array of update counts, with one entry for each command in the
 *         batch. The elements are ordered according to the order in which
 *         the commands were added to the batch.
 *         <p>
 *         <ol>
 *         <li> If the value of an element is >=0, the corresponding command
 *         completed successfully and the value is the update count for that
 *         command, which is the number of rows in the database affected by
 *         the command.</li>
 *         <li> If the value is SUCCESS_NO_INFO, the command completed
 *         successfully but the number of rows affected is unknown.
 *         <li>
 *         <li> If the value is EXECUTE_FAILED, the command failed.
 *         </ol>
 * @throws SQLException
 *             if an error occurs accessing the database
 */
public int[] executeBatch() throws SQLException;

2 个答案:

答案 0 :(得分:0)

假设您有5个批量更新语句。它们的执行是为了更新20条记录,事先已知。

执行批量更新语句时不会引发BatchUpdateExceptionSQLException

如果返回的int数组中的任何元素不是20,那么您就知道存在意外行为。这可能被视为失败。

修改

来自BatchUpdateExcpetion的JavaDoc(重点是我的补充)

  

批量更新中的命令无法正常执行并且a   抛出BatchUpdateException,驱动程序可能会或可能不会继续   处理批处理中的其余命令。如果司机继续   失败后处理,由该方法返回的数组   BatchUpdateException.getUpdateCounts将包含每个元素   批处理中的命令,而不仅仅是命令的元素   在错误之前成功执行。在司机的情况下   停止 [ed] 处理命令,这是任何命令的数组元素   失败的是Statement.EXECUTE_FAILED。

我的理解是,如果批处理中的任何语句失败,则会抛出BatchUpadteException

答案 1 :(得分:0)

如果批处理中间发生错误,Oracle JDBC驱动程序将抛出BatchUpdateException。

例如,假设您要发送一个包含10个条目的批处理(在您的案例中插入10行)。条目#0到#4成功。条目#5遇到诸如主键违规之类的错误。执行在5处停止,驱动程序抛出BatchUpdateException。如果你调用getUpdateCounts(),你将获得一个大小为10的数组,其中包含5个SUCCESS_NO_INFO和5个EXECUTE_FAILED。

请注意,从12c(数据库和驱动程序)开始,您可以获得批次中每个元素的更新计数。当您批量执行更新时,这会更有用。对于批处理中的每个元素,您可以知道已更新的行数。