0

大量のデータをロードするために、Java アプリケーションから mysql データベースへのバッチ挿入を使用しています。失敗した実行の結果をコンパイルするために、次の方法で BatchUpdateException を処理しています。


catch (BatchUpdateException e)
        {
            int[] codes = e.getUpdateCounts();


            for (int i = 0; i<codes.length; i++)
            {
                if (Statement.EXECUTE_FAILED == codes[i])
                {
                    lr.recordLoadCount--;

                    //`records` is a List containing the objects which were 
                    //added in this batch

                    lr.addFailReason(records.get(i).xmlString());


                }
            }

            lr.addException(e.getMessage());

        }

すべての実行が失敗するケースを実行していました (テーブルが存在しません)。したがって、理想的には、すべてのレコードに失敗の理由を追加する必要があります。

ただし、最初のレコードを除くすべてが追加されていることがわかりました。コードをデバッグすると、codes[0] が「-1」として表示されるのに対し、他のすべては「-3」(Statement.EXECUTE_FAILED) として表示されることがわかりました。

Javadocs によると:

public int[] getUpdateCounts()

戻り値:
実行された更新の更新カウントを含む int の配列
このエラーが発生する前に成功しました。

または、ドライバーがエラーの後もコマンドの処理を続行する場合は、
バッチ内のすべてのコマンドについて、次のようにします。

 - 更新カウント
 - Statement.SUCCESS_NO_INFO ('-2')
 - Statement.EXECUTE_FAILED ('-3')

質問: MySql コネクタ/J がバッチの最初の実行失敗に対して更新カウントを正しく設定しないのでしょうか、それともここで何か不足していますか? 誰かがそのようなシナリオに出くわしたことがありますか?

connector/J 5.1.30 を使用しています。Ubuntu 12.04 上の Mysql 5.5.24

4

1 に答える 1

0

問題は「rewriteBatchedStatements = true」接続オプションにあることがわかりました。このオプションを使用すると、報告された問題が発生します。バグとして報告します。

于 2014-06-11T09:31:39.710 に答える