当前位置: 首页 > 知识库问答 >
问题:

部分故障情况下的ExecuteBack行为

段干飞翮
2023-03-14

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

注意:这个问题专门针对Oracle JDBC。更清楚地说,我看到过这样的情况:在执行executeBatch()之后,我没有得到BatchUpdateException,但是一些insert语句失败了。我的问题是在什么情况下会发生这种情况?

这是语句的返回javadoc。executeBatch()方法。根据这里的一般观点,当一个条目失败时,执行会抛出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个答案

廉鸿运
2023-03-14

如果在批处理过程中发生错误,Oracle JDBC驱动程序将引发BatchUpdateException。

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

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

燕意蕴
2023-03-14

假设您有5条批量更新语句。每一次的执行都需要更新20条记录,这是事先知道的。

执行该批update语句时,不会引发BatchUpdateException,也不会引发SQLException

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

编辑

来自BatchUpdateExcpetion的JavaDoc(亮点是我添加的内容)

在批处理更新中的命令未能正确执行且引发BatchUpdateException后,驱动程序可能会继续处理批处理中的其余命令,也可能不会继续处理。如果驱动程序在发生故障后继续处理,则BatchUpdateException方法返回的数组。getUpdateCounts将为批处理中的每个命令都有一个元素,而不仅仅是错误之前成功执行的命令的元素。在驱动程序停止[ed]处理命令的情况下,任何失败命令的数组元素都是语句。执行失败。

我的理解是,如果批处理中的任何语句失败,那么将抛出一个BatchUpadteException

 类似资料:
  • 本部分就 Ceph 存储集群常见的问题做了归纳和总结,方便运维人员进行故障排除。

  • 3.1 PG 无法达到 CLEAN 状态 创建一个新集群后,PG 的状态一直处于 active , active + remapped 或 active + degraded 状态, 而无法达到 active + clean 状态 ,那很可能是你的配置有问题。 你可能需要检查下集群中有关 Pool 、 PG 和 CRUSH 的配置项,做以适当的调整。 一般来说,你的集群中需要多于 1 个 OSD,

  • 进行 OSD 排障前,先检查一下 monitors 和网络。如果 ceph health 或 ceph -s 返回的是健康状态,这意味着 monitors 形成了法定人数。如果 monitor 还没达到法定人数、或者 monitor 状态错误,要先解决 monitor 的问题。核实下你的网络,确保它在正常运行,因为网络对 OSD 的运行和性能有显著影响。 2.1 收集 OSD 数据 开始 OSD

  • Monitor 维护着 Ceph 集群的信息,如果 Monitor 无法正常提供服务,那整个 Ceph 集群就不可访问。一般来说,在实际运行中,Ceph Monitor的个数是 2n + 1 ( n >= 0) 个,在线上至少3个,只要正常的节点数 >= n+1,Ceph 的 Paxos 算法就能保证系统的正常运行。所以,当 Monitor 出现故障的时候,不要惊慌,冷静下来,一步一步地处理。 1

  • 主要内容:1. 事务失败,2. 系统崩溃,3.磁盘故障要找到问题发生的位置,我们将故障(失败)归纳为以下类别: 事务失败 系统崩溃 磁盘故障 1. 事务失败 当事务无法执行或者它到达无法继续执行的点时发生事务失败。 如果一些事务或进程受到损害,那么这称为事务失败。 事务失败的原因可能是 - 逻辑错误:如果由于某些代码错误或内部错误情况导致事务无法完成,则会发生逻辑错误。 语法错误:它发生在DBMS本身终止活动事务的位置,因为数据库系统无法执行它。 例

  • 我有一些程序的问题,我已经搜索了关于分割错误,我不太理解他们,我唯一知道的是,大概我试图访问一些我不应该访问的内存。问题是我看到我的代码,不明白我做错了什么。 谢谢你的时间。