Grailsアプリケーション内でDBCPを使用しています。データベースは別のサーバー上にあるため、ここではTCP/IPが機能しています。show processlistを頻繁に実行してデータベースを監視してきましたが、50を超える接続は表示されません。ただし、クライアントのソケットは非常に大きくなります(ある時点で2700を超えました)。それらのほとんどはTIME_WAITステータスです。
したがって、ソケットを開くことができないため、最終的にNoRouteToHostExceptionが発生します。
このユースケースでは、1分以内に40,000回以上データベースにアクセスしたことに注意してください。
なぜこれが起こるのかについて誰かが提案を持っていますか?私たちの接続プールは100に制限されているので(そして開いている接続は約50しかありません)、たまに古くなる可能性があるので、50をわずかに超えるだけだと思います。しかし、私たちは何千人も見ています。これは期待されていますか?または、この状況を見たときに私たちが見逃しているかもしれない何かについての他のヒントはありますか?
使用しているdbcp設定は次のとおりです。
properties {
maxActive = 100
maxIdle = 4
minIdle = 1
initialSize = 1
minEvictableIdleTimeMillis = 60000
timeBetweenEvictionRunsMillis = 60000
maxWait = 10000
removeAbandoned = true
removeAbandonedTimeout = 60
validationQuery = "/* PING */ SELECT 1"
testOnBorrow = true
testWhileIdle = true
numTestsPerEvictionRun = -1
logAbandoned = true
}
また、接続文字列にautoReconnect = trueを使用していることにも注意してください。ただし、削除することを検討しています(それ以外の場合は、一晩で古い接続が発生します)。
ありがとう!