大規模なアプリケーションのどこかに、接続プールに接続を返さないコードがあります。その結果、プールはすぐに最大接続数に達します。
これは、放棄された接続を削除するように設定することで回避できますが、パフォーマンスが低下します。
tomcat dbcp でログを有効にして、接続が借用され返されたときに表示されるようにするにはどうすればよいですか?
大規模なアプリケーションのどこかに、接続プールに接続を返さないコードがあります。その結果、プールはすぐに最大接続数に達します。
これは、放棄された接続を削除するように設定することで回避できますが、パフォーマンスが低下します。
tomcat dbcp でログを有効にして、接続が借用され返されたときに表示されるようにするにはどうすればよいですか?
接続の借用と返却のロギング
私は自分自身の答えを提供するためにこの質問をしました。おそらく多くの人がこの問題を抱えているわけではありませんが、接続を開いたままにしているコードを追跡するのは本当に大変でした. ここで説明するソリューションを小さな github プロジェクトにまとめました: https://github.com/chronakis/dbcp-conn-log。そこに移動するか、ここで簡単な説明を続けることができます。
ソースを調べた後、Tomcat DBCP はロギングを構築していないようです。私が見つけた最良の方法は、AspectJ を使用して、プールから接続を取得するメソッドとプールに接続を返すコードの周りにロギング メソッドを織り込むことでした。ロギング メソッドは、次のように、接続を開いて返すコードの一部を示す短い便利な呼び出しトレースを出力します。
+++ getConnection(52d02201): MyDAOSQL.getConnection(69) > MyDAOSQL.getCustomerByName(568) > ...
--- retConnection(52d02201): MyDAOSQL.getCustomerByName(568) > CustomerController.getCustomer(67) > ...
+++ getConnection(7100721a): MyDAOSQL.getConnection(69) > MyDAOSQL.getBasket(568) > ...
--- retConnection(7100721a): MyDAOSQL.getBasket(568) > CustomerController.getBasket(67) > ...
コンテキスト xmlを使用していると仮定するとjava.sql.DataSource、接続を取得して返すメソッドは次のとおりです。
取得:org.apache.tomcat.dbcp.dbcp2.PoolingDataSource.getConnection
リターン:org.apache.tomcat.dbcp.dbcp2.PoolingDataSource.PoolGuardConnectionWrapper.close
これを知っていれば、これらのメソッドにロギング メソッドを織り込み、AspectJ maven プラグインを使用してコードにコンパイルするのは簡単です。プロジェクトは次のとおりです。これらのファイルを小さな github プロジェクトにまとめました: https://github.com/ chronakis/dbcp-conn-log
ログ ツールからの出力により、コード接続が閉じていない場所を簡単に見つけることができます。
実際の sql アクティビティのログ記録
さらに詳細が必要な場合は、p6spy (github で検索) などを使用して、JDBC レイヤーを sql クエリまで追跡できます。特にmavenでのインストールは非常に簡単です。