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

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

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

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

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

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

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

  6. 有更好的方法吗?

【问题讨论】:

    标签: java mysql database jdbc connector-j


    【解决方案1】:

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

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

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

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

    4. ?

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

    6. ?

    【讨论】:

    猜你喜欢
    • 2012-10-09
    • 2012-03-10
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2016-07-11
    • 1970-01-01
    • 2017-05-01
    相关资源
    最近更新 更多