Hibernateのflush()って(2)

id:koichikさんからHibernateのflush()について情報を頂くことができました。
私なんかのために丁寧な解説ありがとうございます。


http://d.hatena.ne.jp/bluerabbit/comment?date=20060124#c

flush 時に DB アクセスが行われるのはその通りですが,flush の回数が DB アクセスの回数というわけではありません.
3000件追加する例だと,最終的には 3000 件の INSERT 文が実行されます.
もし RDBMS がバッチ更新をサポートしていれば,バッチサイズ分まとめて実行されます.バッチサイズのデフォルト値は 15 です.
よって,100 件毎に flush した場合の DB アクセス回数は ceil(100 / 15) * 30 で 210 回となり,1回だけ flush した場合は 3000 / 15 で 200 回となります.
この差は100件毎に flush したこと自体によって生じる差ではなく,100 という数がバッチサイズの倍数でないことによって生じます.
バッチサイズを 20 に設定すれば,DB アクセス回数はどちらも 150 回になります.
あるいは,バッチサイズが 15 のままでも 150 件毎 flush にすれば DB アクセス回数は 1 回 flush と同じ 200 回になります.
上記のことは DB アクセス回数の話であり,全体の処理時間は別の話になります.
flush の回数を減らせばその処理時間を減らせる可能性がありますが,メモリ使用量とのトレードオフも考えるべきでしょう.

「flush の回数が DB アクセスの回数というわけではありません」ということは知っていましたが、
バッチサイズのデフォルト値は15というのは知りませんでした。

なお,taka_2 さんには 10/04 のコメント欄で明示的に flush() を行わない
(コミット時に 1 回のみ) ケースも試して頂けるようお願いしましたが,
taka_2 さんの環境では明確な差はなかったようです


ということは完全に私の勘違いだったんですね〜。
経験としてはJDBCよりHibernateの方が早く感じたんですけどね・・。
(処理内容にもよるからなんとも言えないか。)
となるとやっぱり使いやすさがいいS2Daoを使う方がいいってことかな。
S2Daoも検討ってことでcommit。


id:koichikさん助かりました改めてありがとうございました。