0

多くのデータを MySQL データベースに記録するアプリケーションがあります。運用中のバージョンでは、パフォーマンスを向上させるために、バッチで挿入ステートメントが既に実行されています。無関係なデータの一部がルックアップで結合できる別のテーブルに送信されるように、db スキーマを少し変更しています。

ただし、バッチ システムで動作するクエリを適切に設計しようとしています。mysql を使用したかったLAST_QUERY_IDので、生成されたキーを取得してそれらを一致させることを心配する必要はありません (非常に難しい作業のようです)。

ただし、さまざまな挿入ステートメントをバッチに追加する方法が見つからないようです。どうすればこれを解決できますか? 2 番目のバッチを作成し、すべての詳細クエリをそれに追加する必要があると思いますが、それは 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

これはバッチ処理の仕組みではありません。バッチ処理は1 つの 内でのみ機能StatementPreparedStatementます。これは、1 つの同じステートメントに対してのみパラメーターのバッチを追加できることを意味します。あなたのコードは、ステートメントの実行も無視しています。

やりたいことについては、 を使用しsetAutoCommit(false)、両方のステートメントを実行してからcommit()(またはエラーが発生した場合はロールバック) する必要があります。

また、生成されたキーを取得する JDBC 標準の方法を検討することをお勧めします。これにより、コードが MySQL 固有でなくなります。JDBC による AUTO_INCREMENT カラム値の取得も参照してください。

于 2013-11-03T18:08:36.780 に答える