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」は、ループを通過するたびにどのtables[i]であるかに基づいて置き換えることができます。

私はこれまで考えられるあらゆる方法を試しましたが、SQLに対して無効であるか、毎回最後のINSERTを除くすべてが欠落しているだけで、すべて同じ結果になります。

結局、私はすべての挿入物、おそらく100、おそらく1000をバッチ処理するループを作りたいと思っています。いずれにせよ、すべての挿入をループしてバッチ処理し、すべてが完了したらバッチを実行する必要があります。もう1つの方法は、すべての挿入を単独で実行することです。これにより、そもそもバッチ関数を使用する理由がなくなります。

これを行う方法があった場合のみ:

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を1回だけ呼び出すことはできません。prepareStatementへの各呼び出しには、addBatchへの複数の呼び出しが含まれる場合がありますが、executeBatchへの独自の呼び出しが必要です。

したがって、JavaとMySQLの間の通信を最小限に抑えるために、MySQLでストアドプロシージャを使用することを検討します。そして、いつものように最適化では、もっと複雑な方法(ストアドプロシージャ)が実際に必要であると結論付ける前に、簡単な方法で試してみます。

また、executeBatchを使用すると、他の人が自動コミットをオフにしていることもわかります。

于 2012-08-15T07:15:38.460 に答える