サポート > Wagby Developer Network(R7) > Javaを用いたカスタマイズ > データベースのコネクションプーリング数を監視する

カスタマイズによって独自にデータベース操作を行う場合、コネクションの閉じ忘れはリソース枯渇の原因になります。このような場合、コネクションプーリング数を監視することで原因を特定しやすくなります。

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

<Resource name="jdbc/jfc" auth="Container"
             type="javax.sql.DataSource"
             driverClassName="com.mysql.jdbc.Driver"
             url="jdbc:mysql://localhost/xxxdb?useUnicode=true&relaxautoCommit=true"
             username="xxx"
             password="xxx"
             maxActive="24"
             maxIdle="8"
             maxWait="2000"
             defaultAutoCommit="false" />

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

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

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

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

コネクションプーリングで使用されているコネクションの数を確認する方法を説明します。ここでいうコネクションとは、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

ここで説明するのは、Wagby内部の DbBaseController クラスで行っている getConnection, closeConnection メソッドの動作を確認するものです。これは java.sql.Connection の取得のみであり、Hibernate Session は含まれません。

設定ファイル wagbyapp\webapps\[アプリケーション名]\WEB-INF\classes\log4j.properties に下記の設定を追加します。

log4j.logger.jp.jasminesoft.jfc.controller.DbBaseController=DEBUG

この設定を行うと、Wagby 内部でコネクションプールからコネクションを取得する時およびクローズする時に下記のようなログを出力します。

[DEBUG jp.jasminesoft.jfc.controller.DbBaseControllergetConnection] (admin)
Connection object has been reassigned.
[INFO jp.jasminesoft.jfc.controller.DbShowListBaseControllerperform_db]
(admin@0:0:0:0:0:0:0:1) showListJuser|Search
[DEBUG jp.jasminesoft.jfc.controller.DbBaseControllercloseConnection] (admin)
database connection is closed.

この例では、コネクションの取得 (reassigned) と解放 (closed) はセットで行われていることがわかります。これは正常なログです。

上記 (1) と (2) の両方をチェックすることで、Hibernate Session のクローズ漏れがある場合、(1) の active数だけが増えます。例えばカスタマイズコード(スクリプトを含む)で独自に Hibernate Session をオープンしてクローズを行っていない場合などを検出することができます。