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как ошибка говорит делать, но связь продолжает умирать. Я никогда не видел, чтобы это случилось раньше.

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

19.08.2008 10:17:24
4 ОТВЕТА
РЕШЕНИЕ

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

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

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

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

removeAbandonedTimeout="60"

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

testWhileIdle=true
timeBetweenEvictionRunsMillis=300000
9
19.08.2008 13:40:10
Приятно. Я установил параметры в context.xml, и я собираюсь оставить его на 24 часа. Если это не сработает, я не приму ответ. Но это выглядит многообещающе! Спасибо!
Matt MacLean 19.08.2008 14:25:13

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

0
19.08.2008 19:06:11

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

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

4
16.09.2008 16:12:44
Как называется это свойство? Я хотел бы проверить это дважды. "thread_pool_idle_timeout = 60" это все, что я вижу.
Kerem 18.03.2015 01:32:30
@ Mass, я понятия не имею. Мой ответ выше 7 лет, и я уже несколько лет не пользуюсь ресурсом Tomcat или Servlet. Насколько я могу судить, timeBetweenEvictionRunsMillis является свойством тега Resource в context.xml, а thread_pool_idle_timeout является ключом файла .property.
Sindri Traustason 18.03.2015 11:12:18
Прямо сейчас, насколько мне известно, установка timeBetweenEvictionRunsMillis все еще запускает очиститель соединений для пула источников данных jdbc. Однако thread_pool_idle_timeout был параметром MySQL, на который я ссылался. Я сомневаюсь, что текущие значения по умолчанию короче, чем 8 часов, но все равно спасибо за ответ. Похоже, что принятое решение сработало для ФП, я попробую.
Kerem 18.03.2015 15:40:33

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

1
9.02.2009 13:21:44