В чем разница между autoReconnect и autoReconnectForPools в коннекторе MySql/J?

В справочнике по конфигурации для MySql J-драйвер коннектора выдается предупреждение об использовании свойства autoReconnect. Я следовал инструкциям и увеличил wait_timeout своего сервера. Поскольку я использую DBCP (я подумываю о переходе на c3po после прочтения нескольких сообщений о том, как Stackoverflow сбивает DBCP), можно ли использовать свойство autoReconnectForPools? Что он на самом деле делает, когда включен в DBCP или в любом пуле соединений, если на то пошло?


person ashitaka    schedule 09.02.2009    source источник


Ответы (3)


autoReconnect вызовет исключение SQLException для клиента, но попытается восстановить соединение.

autoReconnectForPools будет пытаться пропинговать сервер перед каждым выполнением SQL.

В прошлом у меня было много проблем с dbcp, особенно с отключением. Большинство из них было решено путем перехода на c3p0. Обратите внимание, что драйвер mysql имеет тестер соединения для c3p0 (com.mysql.jdbc.integration.c3p0.MysqlConnectionTester).

Кроме того, вы можете проверить это: Параметры пула соединений с JDBC: DBCP против C3P0

person David Rabinowitz    schedule 02.04.2009
comment
Как правило, более современные пулы, такие как HikariCP или Tomcat DBCP, будут использовать метод 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, который намного быстрее, чем выполнение тестового запроса, и специально разработан, чтобы никогда не возвращать разорванные соединения с клиентским приложением.

person rustyx    schedule 06.04.2015

Вы уверены, что правильно используете DBCP?

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

Единственное, что вам нужно сделать, — это убедиться, что вы настроили свойство validationQuery на ненулевую строку, например «SELECT 0» для базы данных MySQL (здесь — это сообщение о разных значениях validationQuery для каждой БД использовал).

person StatsTrade    schedule 06.06.2012