0

我有一个将大量数据记录到 MySQL 数据库的应用程序。生产版本已经批量运行插入语句以提高性能。我们正在稍微更改 db 模式,以便将一些无关数据发送到我们可以在查找时加入的不同表。

但是,我正在尝试正确设计查询以与我们的批处理系统一起使用。我想使用 mysql LAST_QUERY_ID,所以我不必担心获取生成的密钥并匹配它们(似乎是一项非常困难的任务)。

但是,我似乎找不到将不同的插入语句添加到批处理中的方法,那么如何解决这个问题呢?我假设我需要构建第二批并向其中添加所有详细查询,但这意味着 LAST_QUERY_ID 失去了意义。

s = conn.prepareStatement("INSERT INTO mytable (stuff) VALUES (?)");
while (!queue.isEmpty()){
    s.setLong(1, System.currentTimeMillis() / 1000L);
    // ... set other data
    s.addBatch();

    // Add insert query for extra data if needed
    if( a.getData() != null && !a.getData().isEmpty() ){
        s = conn.prepareStatement("INSERT INTO mytable_details (stuff_id,morestuff)
                                   VALUES (LAST_INSERT_ID(),?)");
        s.setString(1, a.getData());
        s.addBatch();
    }
}
4

2 回答 2

0

虽然我希望有更好的方法,但我现在已经修复了它。我构建了一个额外数据值的数组列表,我可以将其与从批量插入返回的 generateKeys 相关联。第一个查询批处理执行后,我使用正确的 ids/data 构建第二个批处理。

于 2013-11-03T18:05:59.207 回答
0

这不是批处理的工作方式。批处理仅适用于 one Statement,对于 aPreparedStatement这意味着您只能为同一条语句添加批量参数。您的代码也忽略了执行语句。

对于您想要做的事情,您应该使用setAutoCommit(false), 执行这两个语句,然后执行commit()(或者如果发生错误则回滚)。

此外,我建议您查看检索生成的密钥的 JDBC 标准方法,因为这将使您的代码不那么特定于 MySQL。另请参阅通过 JDBC 检索 AUTO_INCREMENT 列值

于 2013-11-03T18:08:36.780 回答