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 件のコメント:
コメントを投稿