Java + Tomcat, умирает соединение с базой данных? - PullRequest
14 голосов
/ 19 августа 2008

У меня настроен экземпляр 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 ]

9 голосов
/ 19 августа 2008

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

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

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

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

removeAbandonedTimeout="60"

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

testWhileIdle=true
timeBetweenEvictionRunsMillis=300000
5 голосов
/ 16 сентября 2008

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

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

1 голос
/ 09 февраля 2009

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

0 голосов
/ 19 августа 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...