mysql jdbc连接器批量更新异常更新计数不如预期

Posted

技术标签:

【中文标题】mysql jdbc连接器批量更新异常更新计数不如预期【英文标题】:mysql jdbc connector batch update exception update count not as expected 【发布时间】:2014-06-10 12:17:52 【问题描述】:

我正在使用我的 Java 应用程序中的批量插入到 mysql 数据库中进行批量数据加载。为了编译执行失败的结果,我们通过以下方式处理 BatchUpdateException:

catch (BatchUpdateException e) int[] codes = e.getUpdateCounts(); for (int i = 0; i<codes.length; i++) if (Statement.EXECUTE_FAILED == codes[i]) lr.recordLoadCount--; //`records` is a List containing the objects which were //added in this batch lr.addFailReason(records.get(i).xmlString()); lr.addException(e.getMessage());

我正在运行一个所有执行都失败的案例(表不存在)。所以理想情况下,我会为每条记录添加失败原因。

但是,我发现除了第一条记录之外的所有记录都被添加了。当我调试代码时,我发现代码 [0] 以“-1”的形式出现,而所有其他代码都以“-3”的形式出现(即 Statement.EXECUTE_FAILED)。

根据 Javadocs:

公共 int[] getUpdateCounts() 回报: 包含已执行更新的更新计数的 int 数组 在此错误发生之前成功。 或者,如果驱动程序在发生错误后继续处理命令,则 批处理中的每个命令如下: - 更新计数 - Statement.SUCCESS_NO_INFO ('-2') - Statement.EXECUTE_FAILED ('-3')

问题: 是 MySql 连接器/J 没有正确设置批量第一次执行失败的更新计数,还是我在这里遗漏了什么?有没有人遇到过这样的情况?

我正在使用连接器/J 5.1.30; Ubuntu 12.04 上的 MySQL 5.5.24

【问题讨论】:

听起来是个 bug,也许你应该向 Oracle 提交一张票。 @MarkRotteveel 似乎如此。只是想在我提出罚单之前确认一下。谢谢。 你举报了吗? 【参考方案1】:

我发现问题在于“rewriteBatchedStatements=true”连接选项。使用此选项时,会发生报告的问题。将其报告为错误。

【讨论】:

以上是关于mysql jdbc连接器批量更新异常更新计数不如预期的主要内容,如果未能解决你的问题,请参考以下文章

mysql批量更新出错

请求处理失败;嵌套异常是 org.hibernate.exception.ConstraintViolationException:无法执行 JDBC 批量更新

Mybatis -- 批量更新 -- updateBatch

mybatis批量插入,批量更新 com.mysql.jdbc.exceptions.MySQLSyntaxErrorException

mybatis批量更新

jdbc-批量插入批量删除批量更新