19

Connector/J を使用して、マスター テーブルへのバッチ挿入を実行した後、詳細テーブルへのバッチ挿入を実行したいと考えています (PreparedStatement.executeBatch()両方の場合)。私はオンラインで多くの情報を見つけていないので、これを経験した人からのフィードバックを探しています.

  1. Statement.getGeneratedKeys()詳細挿入で外部キーとして使用できるように、マスター テーブルに新しく挿入された行の ID を取得するために使用 できますか?

  2. すべてのクエリが挿入されなかった場合 (たとえば、insert ignoreorinsert ... on duplicate key updateクエリがあった場合) はどうなるでしょうか? すべてのステートメントに対して行を取得しStatement.getGeneratedKeys()ますか、それとも新しいステートメントに対してのみ行を取得しますか?

  3. Statement.getGeneratedKeys()挿入されたマスタ レコードの 1 つにエラーがあり 、接続文字列にcontinueBatchOnError設定されていると何が 返されますか?true

  4. Connector/J バージョン 5.0.x と 5.5.x の間で、関連する動作に違いはありますか? MySQL 5.0 と 5.1 ではどうですか?

  5. 他に知っておくべき問題や落とし穴はありますか?

  6. これを行うより良い方法はありますか?

4

1 に答える 1

20

さて、私はいくつかのテストを実行しました。Connector/J 5.1 と MySQL 5.1.42 を使用すると、次のことがわかります。

  1. Statement.getGeneratedKeys()挿入に対して期待どおりに機能します

  2. 行が挿入または更新された場合 (によって返される更新カウント配列executeBatch()は '1' または '2' を返します)、Statement.getGeneratedKeys()その行のキーを持ちます。行が変更されていない場合 (insert ignoreまたはinsert ... on duplicate key update結果が no-op になり、executeBatch()が返される3場合)、キーはありません。

  3. によって返される ResultSet にはgetGeneratedKeys、(2) に従って、正常に挿入された行のエントリが含まれます。失敗した挿入のキー行は生成されません (ここで、更新カウント値は ですStatement.EXECUTE_FAILED) 。

  4. ?

  5. rewriteBatchedStatementsJDBC 接続文字列には注意してください。に設定されている場合true、失敗すると、書き換えられた「チャンク」のすべての行が失敗したかのように扱われます。これを処理する 1 つの方法は、失敗した行を反復処理し、バッチ処理を行わずに再試行することです。

  6. ?

于 2011-02-11T01:39:50.287 に答える