トランザクション制御とDBへのコネクション

ibatisを使っていると、DB(今回はMySQL)への接続が増える一方で減る気配がない。
# mysqladmin process
としてみるとアイドルな接続がモリモリ。

ibatisではjava.sql.Connection#Close()を明示的に実行する必要がないのは嬉しいけどDBへの接続が溜まり過ぎるのは困る。試行錯誤している中で手動でGCを行なうとMySQLへのコネクションが減った。finalyzeのタイミングか・・・。まあ、明示的にDBとの接続をcloseしないのであれば、DBから切断するタイミングはfinalyzeしかないよな。

それともう一つの理由。com.ibatis.dao.client#startTransaction()を行なっていないと、DAOからSQLを実行する都度、トランザクションを開始してSQLの実行完了後にcommitしている(ibatisが)。

当初はstartTransaction()の事には気づかなかったので、jvmのGC関連のパラメータを調整しても多少の延命はできても、JVMでのOut of memoryかDBでのtoo many connectionがおきてしまうので問題を解決できていない。
ふと、思い立って機能の単位にcom.ibatis.dao.client#startTransaction()とcom.ibatis.dao.client#endTransaction()を入れたことにより、ヒープの使用量とDBへの接続数が安定するようになった。GC関連のパラメータ調整よりもこちらの変更が的確だとおもうので、全体の完成度が上がってきた時点でもう一度GC関連のパラメータを調整する予定。

Leave a comment

Your comment