我们在 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,尽管我们正在考虑删除它(否则我们会在一夜之间得到陈旧的连接)。
谢谢!