大量のデータをロードするために、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