Java + Tomcat, умирает соединение с базой данных?

У меня есть установка экземпляра tomcat, но соединение с базой данных, которое я настроил, context.xml продолжает умирать после периодов бездействия.

Когда я проверяю журналы, я получаю следующую ошибку:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: последний пакет, успешно полученный от сервера, был 68051 секунду назад. Последний пакет, успешно отправленный на сервер, был 68051 секунду назад, что больше, чем заданное сервером значение «wait_timeout». Вам следует рассмотреть возможность истечения срока действия и / или проверки действительности соединения перед использованием в вашем приложении, увеличения значений, настроенных сервером для тайм-аутов клиента, или использования свойства соединения Connector / 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=true как говорит ошибка, но соединение продолжает умирать. Я никогда раньше не видел этого.

Я также убедился, что все соединения с базой данных закрываются должным образом.

Ответов (4)

Решение

Документация Tomcat

DBCP использует пул соединений с базой данных Jakarta-Commons. Он основан на ряде компонентов Jakarta-Commons:

* Jakarta-Commons DBCP
* Jakarta-Commons Collections
* Jakarta-Commons Pool

Этот атрибут может вам помочь.

removeAbandonedTimeout="60"

Я использую тот же материал для пула соединений, и я устанавливаю эти свойства, чтобы предотвратить то же самое, что он просто не настроен через tomcat. Но если первое не сработало, попробуйте это.

testWhileIdle=true
timeBetweenEvictionRunsMillis=300000

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

Просто чтобы прояснить, что на самом деле вызывает это. MySQL по умолчанию завершает открытые соединения после 8 часов бездействия. Однако пул соединений с базой данных будет сохранять соединения дольше.

Таким образом, устанавливая timeBetweenEvictionRunsMillis = 300000, вы даете команду пулу соединений запускать соединения и удалять и закрывать неактивные каждые 5 минут.

Опция removeAbandoned устарела в DBCP 1.2 (хотя все еще присутствует в ветке 1.3). Вот неофициальное объяснение.