oracleでのバッチ処理
オラクルだと、ソースコードの修正を相当小さくして、バッチ処理に変更できるっぽいです。
//通常の更新に比べて多少ソースが変わる・・・・・ PreparedStatement pstmt = conn.prepareStatement("INSERT INTO employees VALUES(?, ?)"); for(Bean bean:list){ ps.setInt (1, bean.getData1()); ps.setString (2, bean.getData2()); pstmt.addBatch(); } pstmt.executeBatch();
//コネクションでバッチ処理を指定するか、 //ステートメントでバッチ処理を指定するかは選べる //片方のみで指示すればよい //コネクションでバッチ処理の指示する例 ((OracleConnection)conn).setDefaultExecuteBatch (BATCH_SIZE); PreparedStatement ps = conn.prepareStatement ("insert into dept values (?, ?, ?)"); //ステートメント単位でバッチ処理の指示する例 ((OraclePreparedStatement)ps).setExecuteBatch(BATCH_SIZE); for(Bean bean:list){ ps.setInt (1, bean.getData1()); ps.setString (2, bean.getData2()); ps.setString (3, bean.getData3()); //挙動が大きく変わるので要注意!!! //要ドキュメント確認!! //下記はバッチ処理になっており、 //バッチ数に達する OR commitされるまで溜められる ps.executeUpdate (); }
詳細はこちら(10g)を参照してください。
あと、個人的に気になるのは、普通のJDBCのバッチ処理の説明の所に
プリコンパイルされたSQL文の場合、バッチ更新を使用して、バインド・パラメータの設定が異なる同じ文の複数の実行をバッチ処理します。PreparedStatementまたはOraclePreparedStatementオブジェクトの場合、addBatchメソッドは入力を取りません。適切なsetXXXメソッドで最後に設定されたバインド・パラメータを使用して、操作をバッチに追加するのみです。CallableStatementまたはOracleCallableStatementオブジェクトでも同じです。ただし、標準バッチ更新のOracle実装では、コール可能文をバッチ処理してもパフォーマンスは向上しません。
という記述があること。コール可能文(=Statement)なのか、コール可能文(=Statement&PreparedStatement)なのかがすごく気になります。暇があったら、パフォーマンス測ってみようかなとおもいます。