В чем разница между autoReconnect и autoReconnectForPools в коннекторе MySql / J? - PullRequest
19 голосов
/ 09 февраля 2009

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

Ответы [ 3 ]

14 голосов
/ 02 апреля 2009

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

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

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

Также вы можете проверить это: Опции пула соединений с JDBC: DBCP против C3P0

7 голосов
/ 06 апреля 2015

Функция MySQL autoReconnect устарела, поскольку имеет много проблем (ссылка: официальная документация ).

autoReconnectForPools имеет мало общего с autoReconnect, имеет больше общего с autoCommit и reconnectAtTxEnd - когда все 3 равны true, он будет пинговать сервер в конце каждой транзакции и автоматически при необходимости восстановите соединение.

Проверка соединения с DBCP несовершенна - даже если установлен testOnBorrow, он иногда возвращает разорванные соединения из пула (не говоря уже о том, что тестирование соединения перед каждым заимствованием ужасно неэффективно).

Согласно этой статье , HikariCP представляется лучшей реализацией пула, поскольку она может использовать API JDBC4 isValid(), который намного быстрее, чем выполнение тестового запроса, и специально разработан, чтобы никогда вернуть разорванные соединения клиентскому приложению.

1 голос
/ 06 июня 2012

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

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

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

...