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&useEncoding=true&characterEncoding=UTF-8" />
Я использую, autoReconnect=true
как говорит ошибка, но соединение продолжает умирать. Я никогда раньше не видел этого.
Я также убедился, что все соединения с базой данных закрываются должным образом.
Ответов (4)4
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). Вот неофициальное объяснение.