ロールバックしたコネクションでMySQLにSLEEPセッションが残ってしまう件

自分がやってるシステム(Seasar2, SAStruts, S2JDBCを使っています)で、
ちょいちょいな頻度でヘンテコリンなデータが入っていて、
JSONをパースするとことでExceptionが発生していました。
 
ログ追ってたら、上記の後続処理で、
ロールバックしたコネクションでSelectにいくところで、
======
[ESSR0308]既にロールバックとしてマークされています
======
ってのが、出ていました。
 
その際に大量にDB(MySQL)にアクセスがある状態だと、
MySQLにSLEEPのセッションが残ってしまって。
# 全部が全部残るわけではなく、この辺のメカニズムがよく分かりません。。
 
ただ、あんまりSLEEPセッションが溜まりすぎると、
新しくセッション張れなくなっちゃうので、#DBへの接続エラーになってしまう。
 
現状はスクリプト書いて定期的に一定時間以上SLEEPしている
セッションを切ってしまっていたのですが、
場当たり的なイケてない対処だよねってことで。
 
あーだこーだトライ&エラーしてたら、
j2ee.diconにaddCommitRuleを設定して、
トランザクションをロールバックするようにマークしないようにしたら、
SLEEPは残らなくなりました。
http://s2container.seasar.org/2.4/ja/tx.html#TransAttribute
 
まぁ、Exceptionが起こらないようにアプリを改修するのですが、
大量アクセスがあるシステムでロールバックしたコネクションには
気をつけよう。。。
 
備忘録的に。。

コメント

タイトルとURLをコピーしました