DBFluteのExampleでは、サポートしているDIコンテナ、 サポートしているDBMSごとにマルチスレッドで負荷を 掛けるテストがあるのですが... (10 スレッドでの一斉検索処理とか) とあるとき、 (Google) Guice + Atomikos + H2 Database の構成で(dbflute-guice-example)、 以下の例外が発生しました。 (Atomikosは、3.3.4)
Caused by: java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(HashMap.java:841) at java.util.HashMap$EntryIterator.next(HashMap.java:883) at java.util.HashMap$EntryIterator.next(HashMap.java:881) at com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean .onXPooledConnectionTerminated(Unknown Source) at com.atomikos.datasource.pool.AbstractXPooledConnection .fireOnXPooledConnectionTerminated(Unknown Source) at com.atomikos.jdbc.nonxa.AtomikosNonXAPooledConnection .fireOnXPooledConnectionTerminated(Unknown Source) at com.atomikos.jdbc.nonxa.AtomikosThreadLocalConnection .checkReusability(Unknown Source) at com.atomikos.jdbc.nonxa.AtomikosThreadLocalConnection .decUseCount(Unknown Source) at com.atomikos.jdbc.nonxa.AtomikosThreadLocalConnection .invoke(Unknown Source) at $Proxy6.close(Unknown Source) at org.seasar.dbflute.s2dao.sqlhandler.TnBasicHandler .close(TnBasicHandler.java:340)
java.util.HashMap のお約束の例外ですね。 必ず発生する訳じゃなく(それまでずっと普通に動いてたし)、 ほんの、ほんの、ほんの時々発生します(最近発生しないかな)。 Seasar(S2Container)や Spring Framework + Commons DBCP では、 一度も発生したことはありません。 無論、自分(Example)の設定の仕方などが悪いのかもしれません。 (また、Atomikosの最新バージョンでは試してないです) ただ、Exampleとしては、特に問題ないのでこれ以上追求して いませんが(DBFluteとの関連性も想像しにくいため)、 もし、Atomikosを実業務で使うときは、ちょっと この辺を検証してからの方が良いのかもしれませんね。