Почему autoReconnect = true не работает? - PullRequest
32 голосов
/ 20 марта 2009

Я использую 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?

Ответы [ 2 ]

32 голосов
/ 20 марта 2009

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

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

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

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

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

2 голосов
/ 20 марта 2009

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

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