概要
データベースとのコネクションリーク(接続の解放漏れ)が疑われる場合、問題の処理を特定するにはどうすればよいでしょうか。WebSphere上にデプロイしているアプリケーションの場合、管理コンソールからログレベルを上げることで、問題の処理を特定できる可能性があります。
手順
- WebSphereの管理コンソールにて、 トラブルシューティング > ログおよびトレース > (サーバー名称) > ログ詳細レベルの変更 を選択する
- 初期状態では
*=info
が指定されているはず。末尾に:ConnLeakLogic=finest
を追加する -
*=info: ConnLeakLogic=finest
と入力したことを確認する - 設定の反映のために、サーバーを再起動する
結果
$WAS_HOME/Profiles/node/logs/%Server_Name%/trace.log
を確認します。
たとえば、コネクションリークによるコネクションプールの枯渇が発生している場合、下記のようなStackTraceが出力されます。既定では、10秒以上使用されているデータベース接続を出力するようです。
000000xx FreePool E J2CA0045E: リソース jdbc/xxx に対してメソッド createOrWaitForConnection を呼び出しているとき、接続が利用不能でした。
000000xx ConnLeakLogic 3 Dumping initial request stack traces
000000xx ConnLeakLogic 3 MCWrapper id xxxxxxxx Managed connection WSRdbManagedConnectionImpl@57055705 State:STATE_ACTIVE_INUSE Thread Id: 000000xx Thread Name: Thread-xx Handle count 1
in-use for 720000ms
java.lang.Throwable
at com.ibm.ejs.j2c.ConnectionManager.allocateConnection(ConnectionManager.java:899)
at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:668)
at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:635)
at (以下略)