0

好的,我要改写这个问题,因为我之前让它有点太复杂了。

我想拿这个:

con.setAutoCommit(false);
String tempforbatch;
Statement stmt = con.createStatement();
for (int i = 0; i < tables.length; i++) {
     tempforbatch = "INSERT INTO " + tables[i] + " VALUES ('" + values[i] + "')";
     stmt.addBatch(tempforbatch);
}
stmt.executeBatch();

并将其变成完全相同的东西,仅使用:

PreparedStatement stmt = con.prepareStatement("INSERT INTO table_name VALUES (?, ?)");

其中 'table_name' 可以根据每次循环中的表 [i] 被替换。

到目前为止,我已经尝试了我能想到的所有可能的方法,结果都是一样的,要么对 sql 无效,要么每次都错过了除了最后一个 INSERT 之外的所有方法。

最后,我想制作一个循环来批量处理所有插入,也许是 100 个,也许是 1000 个,我不知道。无论如何,我希望它循环和批处理所有插入,然后在所有插入完成后执行批处理。另一种方法是自己执行每一个插入,这首先会扼杀使用批处理功能的原因。

如果只有一种方法可以做到这一点:

PreparedStatement stmt = con.prepareStatement("INSERT INTO ? VALUES (?, ?)");
...loop code here....
stmt.setTable(1, "table1");
stmt.setString(2, "value1");
stmt.setString(3, "value2");
stmt.addBatch();
...end loop here....
stmt.executeBatch();

但是,众所周知,.setTable 不存在 :( 如果存在,则可以将其放入循环中,并为每次通过循环赋予不同的表值。这种类型的循环现在可以正常工作,只要将其全部提供给同一张桌子。

4

1 回答 1

0

从其他例子来看(比如java中的PreparedStatement.addBatch有什么限制吗?)当你多次调用prepareStatement时,你不能只调用一次executeBatch。对 prepareStatement 的每次调用,虽然它可以对 addBatch 进行多次调用,但必须有自己对 executeBatch 的调用。

因此,为了尽量减少 Java 和 MySQL 之间的通信,我会考虑在 MySQL 中使用存储过程。和往常一样进行优化,我会先尝试简单的方法,然后再得出结论认为实际上需要更复杂的方法(存储过程)。

我还看到其他人在使用 executeBatch 时关闭了自动提交。

于 2012-08-15T07:15:38.460 回答