为什么MySQL连接长时间保持CLOSE_WAIT状态?

时间:2018-11-28 07:27:27

标签: java mysql tomcat jdbc c3p0

在Spring MVC Web应用程序中,我将C3p0用于MySQL连接池。 C3p0的maxIdleTime设置为1500秒,而MySQL配置wait_timeout设置为1800秒。

我的观察是,每当我在ubuntu Web服务器上执行命令netstat -tanop时,我就会发现与MySQL DB服务器的CLOSE_WAIT tcp连接过多。

enter image description here

如果我在数据库服务器上运行netstat来检查发生了什么,那么,在Web服务器上处于CLOSE_WAIT状态的连接端口在DB服务器上处于FIN_WAIT2状态。它保留了一段时间(60秒),并且已从数据库服务器关闭,但是在Web服务器上,连接仍然保留在CLOSE_WAIT中(大多数时间约为7200秒)。

为什么即使关闭数据库服务器上的同一连接,Web服务器上的连接仍保持CLOSE_WAIT状态?

我尝试将net.ipv4.tcp_tw_reuse设置为1,但没有任何改变。

我对Web应用程序中没有数据库连接泄漏很有信心,因为我启用了C3p0的属性,这些属性可能有助于查找数据库泄漏,即

debugUnreturnedConnectionStackTraces=true
unreturnedConnectionTimeout=30

如果连接在30秒钟内未关闭,此设置将记录异常,它将被视为数据库泄漏。

更新

在Web App中配置的C3p0属性:

minPoolSize=10
acquireIncrement=1
maxPoolSize=500
initialPoolSize=10
numHelperThreads=100
maxIdleTime=2400
maxStatements=20
maxStatementsPerConnection=5
idleConnectionTestPeriod=120
acquireRetryAttempts=10
acquireRetryDelay=100
autoCommitOnClose=false
breakAfterAcquireFailure=false
testConnectionOnCheckout=true
testConnectionOnCheckin=true
preferredTestQuery =SELECT 1
debugUnreturnedConnectionStackTraces=true
unreturnedConnectionTimeout=30

0 个答案:

没有答案