2012-02-10 1 views
0

javaからpostgresqlデータベースにデータを挿入しています。私はjdbc postgresqlドライバを使って接続しています。私はステートメントのバッチを作成し、一度に挿入するために送信しています。しかし、接続が失われた場合、javaは接続プーリングを使用してデータベースに再度接続しようとします。バッチを再度実行しようとしましたが、レコードは挿入されませんでした。例外後にjdbcバッチステートメントを保持する

PreparedStatement pstmt = connection.prepareStatement(INSERT_RECORD_TABLE_SQL); 

while (iterator.hasNext()) { 

pstmt.setLong(1, toLong(fields[0])); 

pstmt.setLong(2, toLong(fields[1])); 

.... 

pstmt.addBatch(); 

} 

try{ 

pstmt.executeBatch(); 

} catch (Exception e) { 

    Thread.sleep(60000); 

    pstmt.executeBatch(); 

} 

私の質問は何ですか?例外が発生した場合に実行可能なステートメントのバッチは保持できますか?

おかげで、

Saurabh Gupta氏

答えて

2

一般的な例外をキャッチする悪いことです。

分、または他の「人間」時間値のために寝るのは悪いことです。

catchブロック内で同じコードを再実行するのは悪いことですが、何も起こっていない場合と同じように、ただしそこで例外を処理しています! catchブロックで新しい例外をキャッチする必要があります。より良い

try 
{ 

    int[] updateCounts = pstmt.executeBatch(); 

} 
catch (BatchUpdateException be) 
{ 
    // if one of the commands sent to the database fails to execute properly 
    // or attempts to return a result set 
    handleException(be); 
    return; 
} 
catch (SQLException se) 
{ 
    //if a database access error occurs, this method is called on a closed Statement 
    //or the driver does not support batch statements 
    handleException(se); 
    return; 
} 

あなたは、トランザクションを必要ですか?つまり、dbを開始する前の状態にロールバックするとエラーが発生した場合、または再試行できますか?

+0

私はBatchUpdateExceptionを使用していますが、間違っていると言いました。私は再びデータベースに再接続するようにスレッドをスリープ状態にします。バッチをもう一度実行しないと、データが失われます。私が間違っている場合、preparedStatement.executeBatch()はバッチ全体を2つ以上の文ではなく1つのトランザクションとして更新します。だから私は同じバッチを再度挿入するように再試行したい。 – Saurabh

+0

これは使用しているJavaのバージョンによって異なります。 _ "Java 2 SDK、Standard Edition、バージョン1.3では、BatchUpdateExceptionオブジェクトがスローされた後にバッチ更新でコマンドを処理し続けるオプションに対応するため、実装および戻り値が変更されています。 – vulkanino

関連する問題