Проверка соединения пула JDBC

На днях у меня произошел сбой в работе моего приложения, и мне нужно понять, как этого избежать в будущем.

У нас есть веб-приложение на основе 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" />

Итак, вот что я понимаю относительно проверки соединения.

  • Соединения не проверяются в режиме ожидания (testWhileIdle = false), при заимствовании (testOnBorrow = false), при возврате (testOnReturn = false)
  • PoolSweeper включен, потому что timeBetweenEvictionRunsMillis> 0, removeAbandoned имеет значение true, а removeAbandonedTimeout> 0

Что меня смущает, так это включение запроса проверки и validationInterval> 0. Поскольку все тесты отключены, использует ли очиститель пула запрос проверки для проверки соединений? Или запрос проверки не имеет значения?

Поэтому, когда сервер базы данных вышел из строя, я считаю, что пул соединений не попытался бы восстановить соединения, потому что не включены проверочные тесты. На мой взгляд, если бы testOnBorrow был включен, тогда, когда сервер базы данных восстановился, были бы установлены действительные соединения, и веб-приложению (то есть tomcat) не потребовался бы перезапуск.

Правильно ли я понимаю, как работает проверка соединения?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
3 401
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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.

Спасибо за подтверждение.

Paul Stoner 05.12.2018 21:01

Другие вопросы по теме