0

我们在 Grails 应用程序中使用 DBCP。数据库在另一台服务器上,因此 TCP/IP 在这里发挥作用。我们经常通过执行 show processlist 来监控数据库,但我们从来没有看到超过 50 个连接。然而,客户端上的套接字增长巨大(有一次我看到超过 2700 个)。其中大部分处于 TIME_WAIT 状态。

所以最终我们得到一个 NoRouteToHostException,因为它不能打开一个套接字。

请注意,在这个用例中,我们在不到一分钟的时间内访问了数据库超过 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 回答