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

Com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: сбой связи

Моя программа, которая подключается к базе данных MySQL, работает нормально. Затем, не меняя код, используемый для настройки соединения, я получаю это исключение:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

Что случилось?

Код, используемый для получения соединения:

private static Connection getDBConnection() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
    String username = "user";
    String password = "pass";
    String url = "jdbc:mysql://www.domain.com:3306/dbName?connectTimeout=3000";

    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection(url, username, password);
    return conn;
}
4b9b3361

Ответ 1

Это обернутое исключение и не очень интересно. Это причина root исключения, которая на самом деле говорит нам что-то о первопричине. Посмотрите еще немного в stacktrace. Шанс большой, и вы столкнулись с SQLException: Connection refused или SQLException: Connection timed out.

Если это верно и в вашем случае, тогда все возможные причины:

  • Неверный IP-адрес или имя хоста в URL-адрес JDBC.
  • Имя хоста в URL-адресе JDBC не распознается локальным DNS-сервером.
  • Номер порта отсутствует или неверен в URL-адресе JDBC.
  • Сервер DB не работает.
  • Сервер DB не принимает соединения TCP/IP.
  • Что-то между Java и DB блокирует соединения, например. брандмауэр или прокси.

Чтобы решить одно или другое, выполните следующие советы:

  • Проверить и проверить их с помощью ping.
  • Обновите DNS или используйте IP-адрес в URL-адрес JDBC.
  • Проверьте его на основе my.cnf базы данных MySQL.
  • Запустите его.
  • Убедитесь, что mysqld запущен без опции --skip-networking.
  • Отключите брандмауэр и/или настройте брандмауэр/прокси для разрешения/пересылки порта.

Кстати (и не имеет отношения к реальной проблеме), вам не обязательно загружать драйвер JDBC для каждого вызова getConnection(). Только один раз во время запуска достаточно.

Ответ 2

установите время ожидания ожидания на сервере БД. Несколько раз он по умолчанию составляет 10 секунд. Это потеряет соединение за 10 секунд.

mysql> show global variables like '%time%' ;

обновите его, сделайте что-то вроде 28800

mysql> SET GLOBAL wait_timeout = 28800;

Ответ 3

У меня эта проблема тоже около 8-9 дней. Вот некоторые предпосылки: я разрабатываю простое Java-приложение, которое работает в bash.

Подробнее:

  • Spring 2.5.6
  • Hibernate3.2.3.ga
  • С maven. (Основой проекта является mkyong.com, учебник spring без анотаций).
  • Версия MySQL:
[[email protected] ~]$ mysql --version
mysql  Ver 14.14 Distrib 5.5.9, for Linux (i686) using readline 5.1
Linux archbox 2.6.37-ARCH #1 SMP PREEMPT Fri Feb 18 16:58:42 UTC 2011 i686 Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz GenuineIntel GNU/Linux

Приложение отлично работает в Arch Linux, Mac OS X 10.6 и FreeBSD 7.2. Когда я переместил файл jar в другой арка linux в другом хосте, используя тот же mysql, похожий my.cnf и аналогичную версию ядра, соединение умерло и получило ту же ошибку, что и исходный плакат:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи канала связи

Я пробовал все возможные комбинации для этого, которые я нашел на этом и на форумах (http://forums.mysql.com/read.php?39,180347,180347#msg-180347, например, который закрыт сейчас и Я не могу опубликовать..), в частности:

  • Тройной проверить, что я не использовал пропустить сетей. (проверяется с помощью ps aux и my.cnf)
  • Пробовал включить log_warnings = 1 в my.cnf, но, очевидно, я не ударил сервер, поэтому я ничего не видел при использовании приложения
  • SHOW ENGINE innodb STATUS ничего не показывал; во время тестов я мог подключиться через оболочку, а php также подключался к серверу mysql
  • /etc/hosts имеет localhost 127.0.0.1
  • Пробовал свойства jdbc с помощью localhost и 127.0.0.1 без каких-либо результатов.
  • Попробовал добавить c3p0 и изменил max_wait
  • Максимальное количество подключений в my.cnf было изменено на 900, 2000 и все еще ничего my.cnf
  • Добавлено wait_timeout = 60 my.cnf
  • Добавлен net_wait_timeout = 360 my.cnf
  • Добавлен метод destroy-method = "close" spring.xml

Как было указано (если вы ищете одно и то же исключение, вы найдете несколько подобных тем о проблеме Воспроизводить com.mysql.jdbc.exceptions.jdbc4.CommunicationsException с настройка Spring, спящий режим и C3P0  например).

Если ссылка удалена, просто добавьте mysqld: ALL в /etc/hosts.allow

Я знаю, что это немного расширенный, но это может помочь любому, кто использует GNU/Linux и имеет это исключение, и этот поток, казалось, был лучшим местом для публикации моих исследований.

Надеюсь, что это поможет

Ответ 4

Я получил ту же ошибку но потом я понял, потому что сервер Mysql не работает в то время.

Итак, чтобы изменить статус сервера

  • Перейдите в Диспетчер задач
  • Перейдите в раздел Службы
  • затем выполните поиск вашего сервера Mysql (например: для моего случая MYSQL56)
  • то в столбце состояния вы увидите, что он не работает.
  • щелкнув правой кнопкой мыши и выберите start

Надеюсь, это поможет.

Ответ 5

У нас есть часть программного обеспечения (webapp с Tomcat), использующая пул соединений Apache commons, и отлично работал годами. В прошлом месяце мне пришлось обновлять библиотеки из-за старой ошибки, с которой мы сталкивались. Ошибка была исправлена ​​в последней версии.

Вскоре после развертывания мы начали получать именно эти сообщения. Из тысяч подключений мы получили бы один день, несколько (до 10, обычно) получили бы это сообщение об ошибке. Не было реальной картины, за исключением того, что они иногда группировались в небольшие группы по 2-5.

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

Вы обновили свой барабан MySQL в последнее время? Похоже, что может быть новая настройка, которая не использовалась в нашей (правда, очень старой) банке.

Я согласен с BalusC, чтобы попробовать другие параметры в вашем конфиге, например, те, которые вы переходите в MySQL (в дополнение к таймауту соединения).

Если этот сбой является временным, как мой, а не постоянным, тогда вы можете использовать простой try/catch и цикл, чтобы продолжать попытки до тех пор, пока все не удастся или не использует пул соединений для обработки этой детали для вас.

Другая случайная идея: я не знаю, что происходит, почему вы пытаетесь использовать закрытое соединение (какое исключение вы получаете). Не могли бы вы случайно закрыть соединение где-нибудь?

Ответ 6

Убедитесь, что skip-networking закомментирован в my.cnf/my.ini

Ответ 7

Как отметил BalusC, было бы очень полезно опубликовать стек полный stacktrace (всегда выставлять полный стек, бесполезно и разочаровывает наличие только первых строк stacktrace).

В любом случае вы упомянули, что ваш код работал отлично, и эта проблема внезапно возникла без изменения кода, поэтому мне интересно, может ли это быть связано с вами другим вопросом Проблема с не закрытием соединения db во время отладки? Фактически, если эта проблема началась при отладке, то я думаю, что это (у вас закончились соединения). В этом случае перезапустите сервер базы данных (и следуйте рекомендациям другого вопроса, чтобы избежать этой ситуации).

Ответ 8

Я столкнулся с той же проблемой. Я использую spring и dbcp и mysql 5.5But Если я изменю localhost на 192.168.1.110, тогда все будет работать. Что делает вещи более странными mysql -h localhost просто отлично работает.

update: Наконец нашел решение. Изменение привязки к localhost или 127.0.0.1 в my.conf устраняет проблему.

Ответ 9

В моем случае локальный интерфейс loopback не запускался, поэтому "localhost" не удалось разрешить. Вы можете проверить это, запустив "ifconfig", и вы увидите интерфейс "lo". Если он не вставлен, вы можете активировать его, запустив "ifup lo" или "ifconfig lo up".

Ответ 10

В моем случае загруженный mysql.com Connector/J 5.1.29.jar имел эту ошибку, тогда как 5.1.29.jar, загруженный из MvnRepository, не.

Это произошло при создании приложения Google appengine в Android Studio (gradle, Windows x64), обменивающегося с сервером Linux MySQL в локальной сети/локальной виртуальной машине.

Ответ 11

Я вижу, что вы подключаетесь к удаленному хосту. Теперь вопрос в том, какой тип сети вы используете для подключения к Интернету?

WINDOWS

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

Если вы используете локальную сеть, установите статический IP-адрес на своем компьютере, а затем добавьте его на свой компьютер.

Надеюсь, это поможет! :)

Ответ 12

Я получил ошибку сбоя связи при использовании java.sql.PreparedStatement с определенным утверждением.

Это было выполнено против MySQL 5.6, Tomcat 7.0.29 и JDK 1.7.0_67 на компьютере с Windows 7 x64.

Причина оказалась для установки целого числа на параметр строки и строки на целочисленный параметр, а затем попытки выполнить executeQuery в подготовленном операторе. После того, как я исправил порядок установки параметров, оператор выполнил правильную работу.

Это не имело ничего общего с сетевыми проблемами, поскольку предложена формулировка сообщения об ошибке.

Ответ 13

Проблема заключается в том, что соединения пула Mysql JDBC не используются, затем Timeout from Mysql, закрывают соединения. Вам необходимо изменить параметры пула, чтобы получить перезапуск соединения, когда соединение имеет сбои, следующим образом:

Connection Validation: Требуется (Проверить)
Validation Method: autocommit

Вы можете изменить метод проверки, если вы не можете заставить его работать!

Ответ 14

Если вы используете WAMP, убедитесь, что он подключен к сети. То, что я сделал, сначала отключил брандмауэр, потом он работал, поэтому после этого я разрешил подключение для всех локальных портов, особенно к порту 80. Чем я избавился от этой проблемы. Для меня это был брандмауэр, который блокировал соединение.

Ответ 15

У меня была та же проблема, и я использовал большинство параметров (autoreconnect и т.д.), но не пытался (test_on_idle или test_on_connect), я собираюсь сделать их дальше.

Однако у меня был этот хак, который заставил меня пройти через это:

У меня есть задание cron под названием Healthcheck, оно просыпается каждые 10 минут и вызывает вызов REST API на сервер. Сервер web/app выбирает это, подключается к db, делает небольшое изменение и возвращается с "да все тихо на западном фронте" или "shitshappening". Когда последний, он отправляет пейджер/электронную почту нужным людям.

У этого есть побочный эффект, всегда поддерживающий пул соединений db. Пока этот cron работает, у меня нет проблем с тайм-аутом соединения db. в противном случае они возникают.