我们在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,但我们正在考虑删除它(否则我们会在一夜之间获得过时的连接)。
谢谢!
答案 0 :(得分:0)
好的,所以我能够解决它。事实证明我误解了maxIdle以及它是如何工作的。
立即释放返回maxIdle上方池中的任何内容。所以大多数连接都被关闭并重新打开,因此套接字耗尽了。