Почему соединения MySQL остаются в состоянии CLOSE_WAIT в течение длительного времени? - PullRequest
0 голосов
/ 28 ноября 2018

В моем веб-приложении Spring MVC я использую C3p0 для пула соединений MySQL.maxIdleTime C3p0 установлен на 1500 секунд, а в конфигурации MySQL wait_timeout установлен на 1800 секунд.

По моим наблюдениям, всякий раз, когда я выполняю команду netstat -tanop на веб-сервере Ubuntu, я вижу слишком много CLOSE_WAIT tcp соединений с сервером БД MySQL.

enter image description here

Если я запускаю 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
...