Почему autoReconnect=true не работает?

Я использую JDBC для подключения к серверу MySQL (я думаю, без пула соединений). В URL-адресе подключения у меня есть autoReconnect=true

Но мое соединение все еще истекает. Я даже проверил conn.isClosed() и это ложь. Но когда я пытаюсь использовать соединение, я получаю следующее исключение.

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.net.SocketException
MESSAGE: Software caused connection abort: socket write error

STACKTRACE:

java.net.SocketException: Software caused connection abort: socket write error
...

Я знаю, что в Java 1.6 вы можете использовать conn.isValid(0) для проверки соединения, но я использую Java 1.5.

Есть ли способ убедиться, что время ожидания не истекло? Или мне придется перейти на Java 1.6?


person Pyrolistical    schedule 20.03.2009    source источник


Ответы (2)


У меня была такая же проблема, и это было совершенно безумно. Вот что говорится в документах на веб-сайте MySQL (выделено мной)

Должен ли драйвер пытаться восстановить устаревшие и/или неработающие соединения? Если этот параметр включен, драйвер будет создавать исключение для запросов, отправленных на устаревшее или мертвое соединение, которое относится к текущей транзакции, но попытается переподключиться до того, как следующий запрос будет отправлен для соединения в новой транзакции. Использование этой функции не рекомендуется, поскольку она имеет побочные эффекты, связанные с состоянием сеанса и согласованностью данных, когда приложения не обрабатывают исключения SQLException должным образом, и предназначена для использования только в том случае, если вы не можете настроить свое приложение для обработки исключений SQLException, возникающих в результате мертвого состояния. и устаревшие соединения должным образом. В качестве альтернативы попробуйте установить для переменной сервера MySQL "wait_timeout" некоторое высокое значение, а не значение по умолчанию, равное 8 часам.

По моему опыту, похоже, что функция «повторного подключения к следующему запросу» тоже не работает, но я использовал MySQL 4.0, что могло быть причиной этого.

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

Рейтинг: эта ссылка содержит немного больше информации, и указывает, что autoReconnect, вероятно, в любом случае будет удален в будущем.

person Eric Petroelje    schedule 20.03.2009
comment
Совету не использовать autoReconnect, потому что он будет удален в будущем, уже 8-10 лет. И все же я все еще вижу, что MySQL 5.x дает рекомендации о том, что настройка свойства автопереподключения Connector/J является вариантом решения этой проблемы... - person Vito Andolini; 05.07.2013
comment
Из связанного документа: не существует 100% безопасного способа автоматического повторного подключения драйвера JDBC в случае обрыва соединения TCP/IP без риска повреждения "состояния" базы данных (даже с транзакционной семантикой) , поэтому эта функция в конечном итоге будет удалена. - person pm_labs; 20.05.2014

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

person chaos    schedule 20.03.2009