Вопрос

У меня есть настройка экземпляра 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&amp;useEncoding=true&amp;characterEncoding=UTF-8"  />

Я использую autoReconnect=true как говорит ошибка, но соединение продолжает рушиться.Я никогда раньше не видел, чтобы такое происходило.

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

Это было полезно?

Решение

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

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 или что-то в этом роде для установки соединения. тайм-аут.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top