Должен ли я часто отключаться / переподключаться к серверу MySQL? - PullRequest
0 голосов
/ 30 января 2011

В моем случае у меня есть приложение, созданное с использованием Java, которое [на данный момент] подключается только один раз к серверу MySQL и поддерживает соединение. Он отправляет запросы в MySQL случайным образом и может оставаться в течение многих часов, не отправляя ни одного запроса, а затем, когда он пытается отправить его снова, JDBC говорит:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: последний пакет, успешно полученный от сервера, был 60314 секунд назад. Последний пакет, успешно отправленный на сервер, был 60314 секунд назад, что больше, чем сконфигурированное сервером значение ' wait_timeout. Чтобы избежать этой проблемы, следует рассмотреть возможность истечения срока действия и / или проверки допустимости соединения перед использованием в приложении, увеличения значений, настроенных сервером для тайм-аутов клиента, или использования свойства соединения Connector / J 'autoReconnect = true'.

Тогда я имею в виду много решений: - Подключение / отключение каждый раз, когда приложение выполняет запрос [но оно также может сделать много запросов в секунду] - Установите для этого свойства autoReconnect значение «true» и восстановите соединение, когда оно получит тайм-аут. Лично мне нравится 2-й. Но вот когда у меня возникает вопрос: рекомендуется ли делать короткие соединения? или это действительно не имеет значения? Почему MySQL Server сохраняет свойство wait_timeout?

Ответы [ 2 ]

1 голос
/ 31 января 2011

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

Я бы предпочел охватить подключения логическим сеансом, например веб-запросом или сообщением электронной почты, если этот логический сеанс имеет разумное ограничение по длине.

Открытие нового соединения в начале нового «логического сеанса», его использование, а затем его отбрасывание - это хорошо, поскольку минимизирует возможное влияние «плохого» или «разорванного» соединения на другие сеансы.

Однако в большинстве случаев вам не нужно обновлять соединение при каждой отдельной операции. Это может быть правильной стратегией для некоторых сценариев.

Пулы соединений обычно не корректно сбрасывают соединение между использованиями (единственный правильный способ сделать это в mysql - отправка пакета com_change_user; немногие API поддерживают это и меньше приложений знают об этом) и, следовательно, утечки состояния от предыдущего пользователя , что может привести к невоспроизводимым ошибкам.

1 голос
/ 30 января 2011

Лучше всего, если вы оставите обработку соединения в пуле соединений. Посмотрите на http://sourceforge.net/projects/c3p0/

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