2012-07-02 18 views
15

私のプログラムが実行されるたびに、JDBCバッチ挿入(一度に約1000行挿入)を実行しています。しかし、いくつかのレコードによってスローされた例外を適切に処理することはできません。JDBCバッチ挿入例外処理

1000レコードのうち100番目のレコードが無効なデータまたは一部の値のサイズが列サイズを超えているため、例外がスローされているとします。例外が発生すると、残りのレコードは挿入されませんとプログラムが間に失敗します。

私が望むのは、100番目のレコードが例外をスローしても、残りの挿入はプログラムの終了前にいつものように行われるはずです。

これを達成する方法を理解できません。提案してください。

編集:ここでは

は、バッチ挿入のために、私は私のアプリで使用していたサンプルコードです。結果セットに約1000レコードがあるとします。

PreparedStatement ps = null; 
while(rs.next()){ 
    //Retrieve the value and set it to a Prepared statement 

    String name = rs.getString("Name"); 
    int age = rs.getInt("Age"); 
    ps.setInt(1, age); 
    ps.setString(2, name); 

    //Finally invoke addBatch 
    ps.addBatch(); 
} 

//Finally call the executeBatch method 
ps.executeBatch(); 

100番目のレコードが例外をスローしている場合は、100番目のレコードも100番目のレコードからのみトリガーします。これを行う方法はありますか?例外を投げたレコードからプロセスを再起動できるようにするには以降もう一度終了しますか?これを達成する方法は?

+2

あなたのコードは? – Alfabravo

答えて

0

コードを見ることなく、私が与えることができる最良のアドバイスは、挿入を行うコードの周りにtry/catchブロックをラップすることです。また、各インサートで(トランザクション接続を前提として)インサートをコミットする必要があります。これにより処理が少し遅くなりますが、プログラムを続行できます。

もっときれいなアプローチは、挿入する前にレコードの事前検証を試みることだと思います。これは、一度に1000レコードしか話していない場合、処理負荷の大部分を占めるべきではありません。

+0

私の創造性の高いポストの提案/ヘルプ? – user182944

25

あなたはexecuteBatchを使用していると仮定しているので、SQL文のバッチを実行していると述べています。 executeBatchステートメントのバッチを実行すると、ステートメントの一部が成功し、ステートメントの一部が失敗することがあります。 1つのステートメントが失敗した場合、それは成功したステートメントをJDBCドライバーがロールバックすることを意味しません。 JDBCドライバは、あるステートメントが失敗した場合、またはステートメントが失敗した場合にバッチ内のステートメントの実行を停止することを選択した場合、バッチ内のすべてのステートメントを実行しようとすることがあります(使用しているドライバがすぐに障害が発生する)。

バッチ内の1つのステートメントが失敗した場合は、BatchUpdateExceptionを取得する必要があります。例外ハンドラでは、getUpdateCountsに電話する必要があります。これにより、文が更新された行の数、成功した文を示すが行数がないことを示すStatement.SUCCESS_NO_INFO、または文が失敗したことを示すStatement.EXECUTE_FAILEDを示すintという配列が得られます。最初の99個のステートメントが成功し、100番目のステートメントがエラーを生成し、残りのステートメントが実行されない場合は、最初の99個の要素が成功を示し、100番目の要素がStatement.EXECUTE_FAILEDを示す100要素配列を取得する必要があります。コードでは、実行されなかった文(この場合は文101-1000)を再試行する必要があります。

+0

私の創始的な投稿についての提案や助けがありますか? – user182944