带DBCP的MySQL正在创建大量的套接字,获得NoRouteToHostException

时间:2013-01-05 00:14:58

标签: mysql sockets apache-commons-dbcp

我们在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,但我们正在考虑删除它(否则我们会在一夜之间获得过时的连接)。

谢谢!

1 个答案:

答案 0 :(得分:0)

好的,所以我能够解决它。事实证明我误解了maxIdle以及它是如何工作的。

立即释放返回maxIdle上方池中的任何内容。所以大多数连接都被关闭并重新打开,因此套接字耗尽了。