S2Hiberanteちょっと適当だけどflushすることによって遅くなるかはやってみました。
1テーブルに対してinsertを3000件行います。
その場合にcommit前に1回flushした場合と100件毎にflushした場合とどのような違いがでるかのテストです。
for (int i = 0; i < 3000; i++) { Employee employee = new Employee(); employee.setEmpno(new Integer(i)); employee.setEname("SCOTT"); employeeDao.save(employee); } Dao insertCont++; if (insertCont % 100 ==0) { // entityManager.flush(); } 100毎flushあり 計測結果 -->[6.297]秒 100毎flushなし 計測結果 -->[5.781]秒
上記の通り、flush回数による性能劣化はわかってもらえるかと思います。
これを踏まえたHiberanteの注意点として
Hiberanteはflushした時だけではなく、検索した時にも同期を取るためのflushが実行される時があるので
その処理によって性能が劣化したりしなかったりと言うことが起こることは知っておく必要がありますね。
setFlushModeで明示的に操作し、尚且つ明示的にロジック内でも保証を取るとうまくいきますが、
このアプローチは大変危険ですね。
プログラマーにはわからないように仕組みを作るってのを私は重視してますから。
※ 1テーブルだけのテストをやってもいまいちなのとDBアクセス回数はこれだけでは実証できないですね。
また今度ベンチマーク実験してみます。