На днях у меня произошел сбой в работе моего приложения, и мне нужно понять, как этого избежать в будущем.
У нас есть веб-приложение на основе Java, работающее на Tomcat 7. Приложение подключено к нескольким различным источникам данных, включая базу данных Oracle.
Вот подробности, сервер базы данных Oracle вышел из строя, и его пришлось перезагрузить. Мое простое понимание подсказывает мне, что это разорвало бы соединения приложения с базой данных, и на самом деле пользователи сообщали об ошибках в приложении.
Источник данных Oracle настроен в sever.xml Tomcat как ресурс GlobalNaming:
<Resource name = "datasource"
auth = "Container"
type = "javax.sql.DataSource"
factory = "org.apache.tomcat.jdbc.pool.DataSourceFactory"
....
initialSize = "4"
minIdle = "2"
maxIdle = "8"
maxActive = "8"
maxAge = "28800000"
maxWait = "30000"
testOnBorrow = "false"
testOnReturn = "false"
testWhileIdle = "false"
validationQuery = "SELECT 1 FROM dual"
validationQueryTimeout = "10"
validationInterval = "600000"
timeBetweenEvictionRunsMillis = "60000"
minEvictableIdleTimeMillis = "900000"
removeAbandoned = "true"
removeAbandonedTimeout = "60"
logAbandoned = "true"
jmxEnabled = "true" />
Итак, вот что я понимаю относительно проверки соединения.
Что меня смущает, так это включение запроса проверки и validationInterval> 0. Поскольку все тесты отключены, использует ли очиститель пула запрос проверки для проверки соединений? Или запрос проверки не имеет значения?
Поэтому, когда сервер базы данных вышел из строя, я считаю, что пул соединений не попытался бы восстановить соединения, потому что не включены проверочные тесты. На мой взгляд, если бы testOnBorrow был включен, тогда, когда сервер базы данных восстановился, были бы установлены действительные соединения, и веб-приложению (то есть tomcat) не потребовался бы перезапуск.
Правильно ли я понимаю, как работает проверка соединения?




Давайте посмотрим на соответствующую часть вашей конфигурации, чтобы избежать недопустимых соединений в вашем пуле.
maxAge = "28800000"
Соединения, независимо от того, действительны они или нет, будут открыты в течение 8 часов. Через 8 часов соединение закрывается, и при запросе будет установлено новое соединение, а в пуле нет свободного соединения. [1]
testOnBorrow = "false"
testOnReturn = "false"
testWhileIdle = "false"
Соединение в пуле не будет проверяться, если оно действительно, когда оно было заимствовано, возвращено и бездействует. [1]
validationInterval = "600000"
Это свойство не действует, поскольку для всех тестов подключения установлено значение false. Этот интервал определяет, когда необходимо протестировать соединение. В вашем примере соединение будет проверяться каждые 10 минут, если для свойства test будет установлено значение true. [1]
Неверное соединение может оставаться открытым до 8 часов с вашей текущей конфигурацией. Чтобы включить проверочные тесты открытых подключений, вы должны установить хотя бы одно свойство теста (testOnBorrow, testOnReturn, testWhileIdle) в значение true.
Обратите внимание, что в случае validationInterval = "600000" проверка / проверка соединения будет выполняться каждые 10 минут. Таким образом, недействительное соединение может быть доступно в пуле до 10 минут независимо от того, какое свойство теста установлено.
Для получения дополнительной информации об отдельных свойствах, пожалуйста, взгляните на [1]: Apache Tomcat 7: пул соединений Tomcat JDBC.
Спасибо за подтверждение.