В моем веб-приложении Spring MVC я использую C3p0 для пула соединений MySQL.maxIdleTime
C3p0 установлен на 1500 секунд, а в конфигурации MySQL wait_timeout
установлен на 1800 секунд.
По моим наблюдениям, всякий раз, когда я выполняю команду netstat -tanop
на веб-сервере Ubuntu, я вижу слишком много CLOSE_WAIT
tcp соединений с сервером БД MySQL.
Если я запускаю netstat на сервере БД, чтобы проверить, что происходит, порт подключения, который в состоянии CLOSE_WAIT
на веб-сервере находится в состоянии FIN_WAIT2
на сервере БД.Он остается в течение некоторого времени (60 секунд) и закрывается от сервера БД, но на веб-сервере это соединение все еще остается в CLOSE_WAIT
(в основном около 7200 секунд).
Почему соединения на веб-сервере остаются в состоянии CLOSE_WAIT
, даже если такое же соединение на сервере БД закрывается?
Я пытался установить net.ipv4.tcp_tw_reuse
в 1, но ничегоизменился.
Я уверен, что в веб-приложении нет утечки соединения с БД, потому что я включил свойства C3p0, которые могут помочь в поиске утечек БД, т.е.
debugUnreturnedConnectionStackTraces=true
unreturnedConnectionTimeout=30
Этот параметр регистрирует исключение, еслиСоединение не закрывается в течение 30 секунд и будет рассматриваться как утечка БД.
ОБНОВЛЕНИЕ
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