0

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を使用していることにも注意してください。ただし、削除することを検討しています(それ以外の場合は、一晩で古い接続が発生します)。

ありがとう!

4

1 に答える 1

0

わかりました、それで私はそれを整理することができました。私はmaxIdleとそれがどのように機能するかを誤解していたことがわかりました。

maxIdleより上のプールに返されたものはすべてすぐに解放されます。そのため、ほとんどの接続が閉じられ、再び開かれていました。そのため、ソケットが使い果たされました。

于 2013-01-10T01:44:35.373 に答える