Подтвердить что ты не робот

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

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

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

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?

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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