Java + Tomcat, Умирающее соединение с базой данных?
У меня есть настройка экземпляра tomcat, но соединение с базой данных, которое я настроил в контексте. xml продолжает умирать после периодов бездействия.
Когда я проверяю журналы, я получаю следующую ошибку:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
Последний пакет, успешно полученный с сервера, составил68051 секунд
тому назад. Последний пакет, успешно отправленный на сервер, составил 68051 секунд
назад, что больше, чем заданное сервером значение
'Wait_timeout. Вы должны рассмотреть вопрос об истечении и/или тестировании
действительность подключения перед использованием в вашем приложении, увеличивая
настроенные сервером значения для тайм-аутов клиента или использование соединителя /J
свойство соединения 'autoReconnect = true', чтобы избежать этой проблемы.
Вот конфигурация в context.xml:
<Resource name="dataSourceName"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="username"
password="********"
removeAbandoned = "true"
logAbandoned = "true"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/databasename?autoReconnect=true&useEncoding=true&characterEncoding=UTF-8" />
Я использую autoReconnect = ture, как говорит ошибка, но соединение продолжает умирать. Я никогда раньше этого не видел.
Я также проверил, что все соединения с базой данных закрываются должным образом.
Ответы
Ответ 1
Документация Tomcat
DBCP использует пул соединений с базой данных Jakarta-Commons. Он зависит от количества компонентов Джакарта-Коммонс:
* Jakarta-Commons DBCP
* Jakarta-Commons Collections
* Jakarta-Commons Pool
Этот атрибут может помочь вам.
removeAbandonedTimeout="60"
Я использую тот же материал объединения пула, и я устанавливаю эти свойства, чтобы предотвратить то же самое, что он просто не настроил через tomcat.
Но если первое не работает, попробуйте это.
testWhileIdle=true
timeBetweenEvictionRunsMillis=300000
Ответ 2
Просто чтобы прояснить, что на самом деле вызывает это. MySQL по умолчанию прерывает открытые соединения через 8 часов бездействия. Однако пул соединений с базой данных будет поддерживать соединения дольше, чем это.
Итак, установив timeBetweenEvictionRunsMillis = 300000, вы инструктируете пул соединений работать через соединения и выселять и закрывать бездействующие каждые 5 минут.
Ответ 3
Опция removeAbandoned устарела с точки зрения DBCP 1.2 (хотя все еще присутствует в ветке 1.3). Здесь неофициальное объяснение.
Ответ 4
Я не знаю, отвечает ли приведенный выше ответ на одно и то же, но некоторые из наших систем используют соединение БД примерно раз в неделю, и я видел, что мы предоставляем флаг -Otimeout или что-то в этом роде для mysql для установите время ожидания соединения.