В справочнике по конфигурации для MySql J-драйвер коннектора выдается предупреждение об использовании свойства autoReconnect. Я следовал инструкциям и увеличил wait_timeout своего сервера. Поскольку я использую DBCP (я подумываю о переходе на c3po после прочтения нескольких сообщений о том, как Stackoverflow сбивает DBCP), можно ли использовать свойство autoReconnectForPools? Что он на самом деле делает, когда включен в DBCP или в любом пуле соединений, если на то пошло?
В чем разница между autoReconnect и autoReconnectForPools в коннекторе MySql/J?
Ответы (3)
autoReconnect вызовет исключение SQLException для клиента, но попытается восстановить соединение.
autoReconnectForPools будет пытаться пропинговать сервер перед каждым выполнением SQL.
В прошлом у меня было много проблем с dbcp, особенно с отключением. Большинство из них было решено путем перехода на c3p0. Обратите внимание, что драйвер mysql имеет тестер соединения для c3p0 (com.mysql.jdbc.integration.c3p0.MysqlConnectionTester).
Кроме того, вы можете проверить это: Параметры пула соединений с JDBC: DBCP против C3P0
Connection.isValid()
. Существует также специальный запрос, который распознает только MySQL, /* ping */ (должен быть именно так), который заставит MySQL использовать облегченный ping< /i> на сервер. Я считаю, что реализация isValid()
все же должна быть более эффективной, так как запрос /* ping */ все еще должен обрабатываться синтаксическим анализатором.
- person brettw; 07.04.2015
Функция MySQL autoReconnect
устарела, так как имеет много проблем (ссылка: официальный документация).
autoReconnectForPools
имеет мало общего с autoReconnect
, это больше связано с autoCommit
и reconnectAtTxEnd
— когда все 3 равны true
, он будет пинговать сервер в конце каждой транзакции и автоматически переподключаться при необходимости.
Проверка соединения DBCP несовершенна — даже когда установлено testOnBorrow
, он иногда возвращает разорванные соединения из пула (не говоря уже о проверке соединения перед каждым заимствованием, что ужасно неэффективно).
Согласно этой статье, HikariCP кажется лучшая реализация пула, поскольку он может использовать JDBC4 isValid()
API, который намного быстрее, чем выполнение тестового запроса, и специально разработан, чтобы никогда не возвращать разорванные соединения с клиентским приложением.
Вы уверены, что правильно используете DBCP?
Согласно кратким примечаниям по настройке, предполагается, что тайм-ауты должны обрабатываться довольно хорошо благодаря стандартному значение testOnBorrow=true
(проверяет соединение перед использованием, и если это не удается, оно удаляется из пула, и вместо этого мы пытаемся получить новое).
Единственное, что вам нужно сделать, — это убедиться, что вы настроили свойство validationQuery
на ненулевую строку, например «SELECT 0» для базы данных MySQL (здесь — это сообщение о разных значениях validationQuery для каждой БД использовал).