2015年4月7日火曜日

CommonsDBCPでminIdle以下のコネクション数になっちゃう時はtimeBetweenEvictionRunsMillis設定しよう

タイトルまま。

ex) そもそものCommonsDBCPの設定の話はこのへんでもみてね
http://www.atmarkit.co.jp/ait/articles/0709/25/news149_3.html

netstatをみたときに、Tomcatのコネクションプーリングのコネクション数が、minIdle以下になってることがあって。

例えばminIdle 5にしたときに、netstat叩いたとして、

$ netstat -an |grep "DBのIPアドレス":3306|grep ESTABLISHED |wc -l

1
みたいな。

で、どうもアイドル状態のコネクションは、検証し続けないとminIdle以下になっちゃうらしいんですね。アクセスが多くなるとmaxIdleまでは増えてくれるんだけど、コネクション生成コストもばかにならないので、minIdle数ぐらいは、常に貼っておいてほしいと。

そんなときは、timeBetweenEvictionRunsMillisを明示的に設定すればよくて(デフォルト値は-1なのでなんもしてない)、これを設定すると、idle中の検証をしてくれるので、minIdle以下のコネクションになることがなくなった(^○^)

手元の環境では、60000(ミリ秒)と設定している。

おわり

追記1

timeBetweenEvictionRunsMillisを明示的に設定したら、もう1ついいことがあった。

ピーク帯にコネクション数が、DBCPで設定してある、maxIdleぐらいまで達するんだけど、そのあと、負荷が下がっても、コネクション数が、mysqlのwait_timeout(デフォルト8時間)ぐらい維持されてたんだよね。

timeBetweenEvictionRunsMillisを設定したら、上記の8時間ぐらい増えた分が維持されていたコネクションが、すみやかに使わなくなったらcloseするようになった。

良いことでした。

٩(๑❛ᴗ❛๑)۶


追記2

http://www.atmarkit.co.jp/ait/articles/0709/25/news149_3.html
これみたら

 testWhileIdle以降はプール内でアイドル状態のコネクションを検証するかどうかのパラメータだ。この機能を使用するときには、validationQueryパラメータが設定されている必要がある。

って書いてたんだけど、このへんのソースみた感じ
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java

特にvalidationQueryにtimeBetweenEvictionRunsMillisが依存してる感じはない(なんか見落としてたらごめん)。

ソース読みきれないので推測入るんだけど、アイドル接続の有効性を確認(クエリを投げての検証)は、validationQueryが必要っぽいんだけど、アイドル接続の生存期間を確認するだけなら、minEvictableIdleTimeMillisのデフォ値で見てくれているので今回は期待した挙動(追記1)になったんだと思う。

0 件のコメント:

コメントを投稿