ループ内更新による性能劣化を改善するために、S2Daoのバッチ更新で IO回数を減らしたかったので調査しました。
今回は、手動作成SQLファイルの実行を前提としています。
S2Daoのバッチ更新が使える条件
そもそも、手動作成SQLファイルの実行では、バッチ更新できませんでした。。
- バッチ更新は、SQL作成時は使用不可。SQL自動作成時のみ利用可能
- beanのプロパティ=nullのカラム除外機能はつかえない http://s2dao.seasar.org/ja/s2dao.html#DefMethod
- beanのプロパティ=変更なしのカラム除外機能はつかえない https://www.seasar.org/issues/browse/DAO-9
いろいろ制約があり、S2Daoを使う限り、ループ内SQL実行は避けられないみたいです。
参考
S2Dao_一括更新 http://s2dao.seasar.org/ja/s2dao.html#Batch
Domaなら、S2Daoで出来なかったことができる
@BatchUpdate の exclude 要素に指定されたプロパティを更新対象外が可能。 https://doma.readthedocs.io/en/2.11.0/query/batch-update/#sql
@BatchUpdateのsqlFileにtrueを設定することで、任意のSQLファイルにマッピングできます http://doma.seasar.org/reference/query/batch_update.html