在Spring MVC Web应用程序中,我将C3p0用于MySQL连接池。 C3p0的maxIdleTime
设置为1500秒,而MySQL配置wait_timeout
设置为1800秒。
我的观察是,每当我在ubuntu Web服务器上执行命令netstat -tanop
时,我就会发现与MySQL DB服务器的CLOSE_WAIT
tcp连接过多。
如果我在数据库服务器上运行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