oracleでのバッチ処理

ラクルだと、ソースコードの修正を相当小さくして、バッチ処理に変更できるっぽいです。

普通のJDBCバッチ処理

//通常の更新に比べて多少ソースが変わる・・・・・

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)なのかがすごく気になります。暇があったら、パフォーマンス測ってみようかなとおもいます。