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&amp;useEncoding=true&amp;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 минут.

Ответ 4

Я не знаю, отвечает ли приведенный выше ответ на одно и то же, но некоторые из наших систем используют соединение БД примерно раз в неделю, и я видел, что мы предоставляем флаг -Otimeout или что-то в этом роде для mysql для установите время ожидания соединения.