В базовой конфигурации для MySql разъем J драйвера, А риск покупателя выдается на использование элемента autoReconnect имущество. Я выполнил инструкции и увеличил свой сервер wait_timeout. Так как я использую ГСБД (я рассматриваю переход к c3po после прочтения нескольких постов на Stackoverflow сбив ГСБД), это нормально использовать autoReconnectForPools недвижимость? Что он на самом деле делает, когда включен в DBCP или в любом пуле соединений?
В чем разница между autoReconnect & autoReconnectForPools в разъеме MySql/J?
Ответ 1
autoReconnect выдаст клиенту SQLException, но попытается восстановить соединение.
autoReconnectForPools попытается выполнить ping-сервер перед каждым выполнением SQL.
В прошлом у меня было много проблем с dbcp, особенно отключений. Большинство из них были решены путем перехода на c3p0. Обратите внимание, что драйвер mysql имеет тестер подключения для c3p0 (com.mysql.jdbc.integration.c3p0.MysqlConnectionTester).
Кроме того, вы можете проверить это: Параметры пула соединений с JDBC: DBCP vs C3P0
Ответ 2
Функция MySQL autoReconnect
устарела, поскольку у нее много проблем (ref: официальная документация).
autoReconnectForPools
имеет мало общего с autoReconnect
, он больше связан с autoCommit
и reconnectAtTxEnd
- когда все 3 являются true
, он будет пинговать сервер в конце каждой транзакции и автоматически при необходимости подключитесь.
Проверка соединения с DBCP несовершенна - даже когда параметр testOnBorrow
установлен, он иногда возвращает неработающие соединения из пула (не говоря уже о проверке соединения до того, как каждый заем ужасно неэффективен).
Согласно в этой статье, HikariCP, похоже, является лучшей реализацией пула, поскольку он может использовать API JDBC4 isValid()
, который много быстрее, чем запуск тестового запроса, и специально разработан, чтобы никогда не возвращать неработающие подключения к клиентскому приложению.
Ответ 3
Вы уверены, что используете DBCP правильно?
В соответствии с короткой записью , она должна обрабатывать таймауты довольно хорошо благодаря значению по умолчанию testOnBorrow=true
(проверяет соединение перед использованием, и если он терпит неудачу, он удаляется из пула, и вместо этого мы пытаемся получить новый).
Единственное, что вам нужно сделать, это убедиться, что вы настроили свойство validationQuery
на ненулевую строку, например. "SELECT 0" для базы данных MySQL (здесь - это сообщение о различных значениях validationQuery для каждого используемого БД).