5

現在、コードは JdbcTemplate の batchUpdate メソッドを使用してバッチ挿入を行います。

私の質問は、更新のいずれかで例外が発生した場合にそれを処理する方法 (ログを追加するだけであると仮定) であり、次の更新 SQL ステートメントを続行しますか?

また、JdbcTemplate の batchUpdate() メソッドはどのように例外を処理しますか?

ここにスニペット。

    /**
     * Saves the list of <code>Item</code> objects to the database in a batch mode
     * 
     * @param objects
     *    list of objects to save in a batch mode
     */
    public void save(final List<Item> listOfItems) {

        for (List<Debit> list : listOfItems) {
            getJdbcTemplate().batchUpdate(insertItem, new ItemBatchPreparedStatementSetter(list));
        }
    }
4

2 に答える 2

7

JdbcTemplate の batchUpdate() メソッドはどのように例外を処理しますか?

バッチ更新の動作はJDBC では定義されていません。

バッチ更新内のコマンドの 1 つが正しく実行されない場合、このメソッドは BatchUpdateException をスローし、JDBC ドライバーはバッチ内の残りのコマンドの処理を続行する場合としない場合があります。

DBMS でこの動作を確認する必要があります。

とにかく、BatchUpdateException春にキャッチされ、いくつかのクリーンアップ後に RuntimeException として再スローされます (実装の詳細はこちらを参照してください)。

このすべてのロジックはトランザクションと絡み合っています。たとえば、挿入がトランザクション境界内にあり、トランザクション境界をRuntimeException介して再スローした場合、トランザクション (および成功したすべての挿入) はロールバックされます。

そのため、必要な「エラー行のみをログに記録する」バッチ ロジックは、DBMS と、バッチ挿入中のエラーに対する JDBC ドライバーの動作に関する追加の知識なしでは効果的に実装できません。

于 2012-03-22T11:14:16.123 に答える