在 MySQL 中通过 Connector/J 使用 getGeneratedKeys 和批量插入

Posted

技术标签:

【中文标题】在 MySQL 中通过 Connector/J 使用 getGeneratedKeys 和批量插入【英文标题】:Using getGeneratedKeys with batch inserts in MySQL with Connector/J 【发布时间】:2011-06-24 13:13:39 【问题描述】:

使用连接器/J,我想批量插入到主表中,然后批量插入到详细信息表中(两者都为PreparedStatement.executeBatch())。我在网上没有找到太多信息,所以我正在寻找有这方面经验的人的任何反馈。

    我可以使用 Statement.getGeneratedKeys()获取 新插入行的 ID 在主表中,这样我就可以 使用它们作为外键 细节插入?

    如果不是每个查询都导致 插入(例如,有一个 insert ignoreinsert ... on duplicate key update 查询)?我会得到一排 在Statement.getGeneratedKeys() 中为每个 声明,还是只针对新声明?

    会发生什么 Statement.getGeneratedKeys()返回 其中一个有错误 插入的主记录,和 continueBatchOnError 设置为 true 在连接字符串中?

    Connector/J 版本 5.0.x 与 5.5.x 之间的相关行为是否存在差异? mysql 5.0 与 5.1 怎么样?

    还有其他我应该注意的问题或陷阱吗?

    有更好的方法吗?

【问题讨论】:

【参考方案1】:

好吧,我进行了一些测试。使用 Connector/J 5.1 和 MySQL 5.1.42,我观察到以下情况:

    Statement.getGeneratedKeys() 在插入时按预期工作

    如果插入或更新了一行(executeBatch() 返回的更新计数数组返回“1”或“2”),Statement.getGeneratedKeys() 将拥有该行的键。如果该行未被修改(insert ignoreinsert ... on duplicate key update 导致无操作,executeBatch() 返回3),则没有键。

    getGeneratedKeys 返回的 ResultSet 将包含成功插入的行的条目,根据 (2)。将不会为失败的插入生成键行(更新计数值为Statement.EXECUTE_FAILED

    ?

    注意 JDBC 连接字符串中的 rewriteBatchedStatements。如果设置为true,任何失败都会导致重写的“块”中的每一行都被视为失败。处理此问题的一种方法是迭代失败的行并重试它们而不进行批处理。

    ?

【讨论】:

请注意,桌子上有一些限制 - ***.com/q/7333524/1339987

以上是关于在 MySQL 中通过 Connector/J 使用 getGeneratedKeys 和批量插入的主要内容,如果未能解决你的问题,请参考以下文章

与 MySql 的连接正在自动中止。如何正确配置Connector/J?

与 MySql 的连接正在自动中止。如何正确配置Connector/J?

MySQL Connector/J 6.x jdbc.properties 配置, mysql-connector-java-6.0.4.jar 异常

在 Windows 7 中设置路径 Connector/J

MySQL 的 Connector/J 可以与 MariaDB 一起使用吗?

MySQL Connector/J 6.x jdbc.properties 配置, mysql-connector-java-6.0.4.jar 异常