Сведения о вопросе

Killer

14:32, 29th August, 2020

Теги

java   mysql   database   tomcat    

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

Просмотров: 545   Ответов: 4

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

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



  Сведения об ответе

SEEYOU

06:44, 3rd August, 2020

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

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

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

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

removeAbandonedTimeout="60"

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

testWhileIdle=true
timeBetweenEvictionRunsMillis=300000


  Сведения об ответе

SSESION

23:30, 5th August, 2020

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

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


  Сведения об ответе

DO__IT

21:06, 1st October, 2020

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


  Сведения об ответе

lourence

04:58, 16th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться