Java+Tomcat, соединение с базой данных умирает?
Вопрос
У меня есть настройка экземпляра Tomcat, но соединение с базой данных, которое я настроил в context.xml
продолжает умирать после периодов бездействия.
Когда я проверяю журналы, я получаю следующую ошибку:
com.mysql.jdbc.Exceptions.jdbc4.CommunicationsException:Последний пакет, успешно полученный с сервера, был 68051 секунды назад.Последний пакет, отправленный успешно на сервер, составил 68051 секунды назад, что длиннее, чем сервер, настроенное значение «wait_timeout».Вы должны рассмотреть вопрос о том, чтобы истекать и/или тестирование достоверности подключения перед использованием в вашем приложении, увеличение настроенных значений сервера для тайм -аутов клиента или с помощью свойства Connector/J Connection 'Product' 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=true
как говорит ошибка, но соединение продолжает рушиться.Я никогда раньше не видел, чтобы такое происходило.
Я также проверил, что все соединения с базой данных закрываются правильно.
Решение
DBCP использует пул соединений с базой данных Jakarta-Commons.Он основан на ряде компонентов Jakarta-Commons:
* Jakarta-Commons DBCP
* Jakarta-Commons Collections
* Jakarta-Commons Pool
Этот атрибут может вам помочь.
removeAbandonedTimeout="60"
Я использую тот же метод пула соединений и устанавливаю эти свойства, чтобы предотвратить то же самое, что просто не настроено через tomcat.Но если первое не помогло, попробуйте вот это.
testWhileIdle=true
timeBetweenEvictionRunsMillis=300000
Другие советы
Просто чтобы уточнить, что на самом деле является причиной этого.MySQL по умолчанию прекращает открытые соединения после 8 часов бездействия.Однако пул соединений с базой данных будет сохранять соединения дольше.
Таким образом, установив timeBetweenEvictionRunsMillis=300000, вы даете указание пулу соединений проходить через соединения, а также вытеснять и закрывать простаивающие каждые 5 минут.
Параметр RemoveAbandoned устарел, начиная с DBCP 1.2 (хотя все еще присутствует в ветке 1.3). ЗдесьЭто неофициальное объяснение.
Я не знаю, делает ли приведенный выше ответ по сути то же самое, но некоторые из наших систем используют соединение с БД примерно раз в неделю, и я видел, что мы предоставляем MySQL флаг -Otimeout или что-то в этом роде для установки соединения. тайм-аут.