データベースのコネクションプーリング数を監視する

最終更新日: 2020年3月14日
R8 | R9

Tomcatのコネクションプールの設定

自動生成したアプリケーション (wagbyapp) 内の設定ファイル wagbyapp\[アプリケーション名]\META-INF\context.xml にデータベースの接続情報が次のように記載されています。

<Resource name="jdbc/jfc" auth="Container"
             type="javax.sql.DataSource"
             driverClassName=...
             url=...
             username=...
             password=...
             maxActive=...
             maxIdle=...
             maxWait=...
             defaultAutoCommit="false" />

この設定の最後の行「defaultAutoCommit="false" />」を下記のように変更してアプリケーションを再起動してください。

             defaultAutoCommit="false"
             removeAbandoned="true" removeAbandonedTimeout="3600"
             logAbandoned="true" />

この設定は removeAbandonedTimeout で指定した時間(上記では3600秒=1時間)閉じられていないコネクションがあった場合、自動的に閉じるようにするという設定です。

また logAbandoned="true" を指定することで、閉じたコネクションを取得したときのスタックトレースを出力します。詳しくは下記をご覧ください。

Wagbyのコネクションのクローズ漏れ調査

コネクションプーリングで使用されているコネクションの数を確認する方法を説明します。ここでいうコネクションとは、java.sql.Connection および Hibernate Session の両方を含みます。

設定ファイル wagbyapp\webapps\[アプリケーション名]\WEB-INF\web.xml に下記の設定を追加してください。

<!-- CheckDataSourceFilter Configuration -->
<filter>
   <filter-name>CheckDataSourceFilter</filter-name>
   <filter-class>jp.jasminesoft.jfc.filter.CheckDataSourceFilter</filter-class>
   <init-param>
     <param-name>checktype_before</param-name>
     <param-value>All</param-value>
     <!-- All or ActiveOver0 -->
   </init-param>
   <init-param>
     <param-name>checktype_after</param-name>
     <param-value>All</param-value>
     <!-- All or ActiveOver0, ChangeBeforeAfter, OverBeforeToAfter -->
   </init-param>
</filter>
<filter-mapping>
   <filter-name>CheckDataSourceFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

この記述を加えると、Webサーバへのリクエストの処理前と処理後にコネクションプールの状況をログに出力します。 active は現在使用中のコネクション数、idle は保留状態のコネクション数です。

まったく処理を行っていないのに active が0より大きい場合はコネクションのクローズ処理が漏れていると考えられます。

以下の例は before と after の前後で active が 0 となっているため、コネクションのクローズ処理漏れが発生していないことを示したものです。

[INFO jp.jasminesoft.jfc.filter.CheckDataSourceFilterdoFilter] before GET
/wagby/showListJuser.do active=0 idle=2
[INFO jp.jasminesoft.jfc.controller.DbShowListBaseControllerperform_db]
(admin@0:0:0:0:0:0:0:1) showListJuser|Search
[INFO jp.jasminesoft.jfc.filter.CheckDataSourceFilterdoFilter] after GET
/wagby/showListJuser.do active=0 idle=2