Решение "сбоя линии связи" с JDBC и MySQL

Я пытаюсь подключиться к локальному серверу MySQL, но я все равно получаю сообщение об ошибке.

Вот код.

public class Connect {

    public static void main(String[] args) {
        Connection conn = null;

        try {
            String userName = "myUsername";
            String password = "myPassword";

            String url = "jdbc:mysql://localhost:3306/myDatabaseName";
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection(url, userName, password);
            System.out.println("Database connection established");
        } catch (Exception e) {
            System.err.println("Cannot connect to database server");
            System.err.println(e.getMessage());
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                    System.out.println("Database Connection Terminated");
                } catch (Exception e) {}
            }
        }
    }
}

и ошибки:

Cannot connect to database server
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.
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.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
        at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344)
        at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2333)
        at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2370)
        at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154)
        at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792)
        at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
        at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
        at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
        at java.sql.DriverManager.getConnection(DriverManager.java:582)
        at java.sql.DriverManager.getConnection(DriverManager.java:185)
        at Connect.main(Connect.java:16)
    Caused by: java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:529)
        at java.net.Socket.connect(Socket.java:478)
        at java.net.Socket.<init>(Socket.java:375)
        at java.net.Socket.<init>(Socket.java:218)
        at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257)
        at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294)
        ... 15 more

Я установил путь к классам, убедился, что my.cnf отключил опцию пропускной сети.

версия java - 1.2.0_26 (64 бит) mysql 5.5.14 Разъем mysql 5.1.17

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

Ответ 1

У меня была такая же проблема в двух моих программах. Моя ошибка:

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.

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

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

Поэтому я предлагаю вам попробовать все решения по одному и не сдаваться!

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

Совет. Для решений, которые необходимо изменить параметры MySQL, вы можете обратиться к следующим файлам:

  • Linux:/etc/mysql/my.cnf или /etc/my.cnf(в зависимости от дистрибутива Linux и используемого пакета MySQL)

  • Windows: C: ** ProgramData **\MySQL\MySQL Server 5.6\my.ini(обратите внимание на ProgramData, а не на программные файлы)

Вот решения:

  • изменение атрибута "привязка-адрес"

Исключить атрибут "связывать-адрес" или изменить его на один из следующих IP-адресов:

связывают-адрес = "127.0.0.1"

или

связывают-адрес = "0.0.0.0"

  • комментирование "skip-networking"

Если в вашем файле конфигурации MySQL есть строка "skip-networking", сделайте комментарий, добавив знак "#" в начале этой строки.

  • изменить "wait_timeout" и "interactive_timeout"

Добавьте эти строки в конфигурационный файл MySQL:

wait_timeout= номер

interactive_timeout = число

connect_timeout = число

  • Убедитесь, что Java не переводит 'localhost' в [: 1] вместо [127.0.0.1]

Так как MySQL распознает 127.0.0.1 (IPv4), но не: 1 (IPv6)

Этого можно избежать, используя один из двух подходов:

Вариант №1: В строке подключения используйте 127.0.0.1 вместо localhost, чтобы избежать перевода локального хоста в: 1

Вариант №2: Запустите java с параметром -Djava.net.preferIPv4Stack = true, чтобы заставить java использовать IPv4 вместо IPv6. В Linux это также может быть достигнуто путем запуска (или размещения его внутри /etc/profile:

export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
  • проверить настройки прокси-сервера операционной системы, брандмауэры и антивирусные программы

Убедитесь, что брандмауэр или антивирусное программное обеспечение не блокируют службу MySQL.

Остановить iptables временно на linux. Если iptables неправильно сконфигурированы, они могут разрешать отправку пакетов tcp в порт mysql, но блокировать tcp-пакеты от возврата в том же соединении.

# Redhat enterprise and CentOS
systemctl stop iptables.service
# Other linux distros
service iptables stop

Остановите антивирусное программное обеспечение в Windows.

  • изменить строку подключения

Проверьте строку запроса. ваша строка подключения должна быть примерно такой:

dbName = "my_database";
dbUserName = "root";
dbPassword = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";

Убедитесь, что в строке нет пробелов. Вся строка соединения должна продолжаться без каких-либо пробелов.

Попробуйте заменить "localhost" на адрес loopback 127.0.0.1. Также попробуйте добавить номер порта в строку подключения, например:

String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";

Обычно порт по умолчанию для MySQL - 3306.

Не забудьте изменить имя пользователя и пароль на имя пользователя и пароль вашего сервера MySQL.

  • обновить файл библиотеки драйверов JDK
  • проверить разные JDK и JRE (например, JDK 6 и 7)
  • не изменять max_allowed_packet

" max_allowed_packet" - это переменная в конфигурационном файле MySQL, которая указывает максимальный размер пакета, а не максимальное количество пакетов. Поэтому это не поможет решить эту ошибку.

  • изменить безопасность tomcat

изменить TOMCAT6_SECURITY = да на TOMCAT6_SECURITY = нет

  • использовать свойство validationQuery

используйте validationQuery = "select now()", чтобы убедиться, что у каждого запроса есть ответы

  • AutoReconnect

Добавьте этот код в строку подключения:

&autoReconnect=true&failOverReadOnly=false&maxReconnects=10

Хотя эти решения не работали, я предлагаю вам попробовать их. Потому что есть некоторые люди, которые решили свою проблему, выполнив следующие шаги.

Но что решило мою проблему?

Моя проблема заключалась в том, что у меня было много SELECT в базе данных. Каждый раз, когда я создавал соединение, а затем закрывал его. Хотя я закрывал соединение каждый раз, но система столкнулась со многими подключениями и дала мне эту ошибку. Я сделал то, что я определил свою переменную подключения как общедоступную (или приватную) переменную для всего класса и инициализировал ее в конструкторе. Затем каждый раз, когда я просто использовал это соединение. Это решило мою проблему, а также резко увеличило мою скорость.

Заключение

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

Ответ 2

Если вы используете MAMP PRO, это простое исправление, которое я действительно хотел бы реализовать, прежде чем я начал искать интернет в течение нескольких дней, пытаясь понять это. Это действительно так просто...

Вам нужно просто щелкнуть "Разрешить доступ к сети MySQL" на вкладке MAMP MySQL.

Действительно, вот оно.

О, и вам нужно будет по-прежнему изменить свой адрес связывания на 0.0.0.0 или 127.0.0.1, как указано в приведенных выше сообщениях, но щелчок на этом поле, вероятно, решит ваши проблемы, если вы являетесь пользователем MAMP.

Ответ 3

Настройка bind-address на сетевой IP-адрес сервера вместо localhost по умолчанию, и для меня работают настройки прав для моего пользователя.

my.cnf:

bind-address = 192.168.123.456

Консоль MySql:

GRANT ALL PRIVILEGES ON dbname.* to [email protected]'%' IDENTIFIED BY 'password';

Ответ 4

Как говорится в подробном ответе выше, эта ошибка может быть вызвана многими вещами.

У меня тоже была эта проблема. Моя настройка была Mac OSX 10.8, с использованием виртуальной виртуальной машины Vagrant от Ubuntu 12.04 с MySQL 5.5.34.

Я правильно настроил переадресацию портов в файле конфигурации Vagrant. Я мог бы использовать telnet для экземпляра MySQL как с моего Mac, так и из VM. Поэтому я знал, что демон MySQL работает и доступен. Но когда я пытался подключиться через JDBC, я получил ошибку "Ошибка связи".

В моем случае проблема была решена путем редактирования файла /etc/mysql/my.cnf. В частности, я прокомментировал строку "# bind-address = 127.0.0.1".

Ответ 5

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

Неплохое решение состоит в том, чтобы время/время было подключаться к демону/службе.

Ответ 6

Я столкнулся с той же проблемой. Это произошло потому, что MySQL Daemon был привязан к IP-адресу машины, что требуется для установления связи с пользователем, у которого есть разрешение на подключение @your_machine. В этом случае у пользователя должно быть разрешение на подключение USER_NAME @MACHINE_NAME_OR_IP

Мне нужен удаленный доступ к моей машине, поэтому я изменил его в my.cnf из

bind-address = MY_IP_ADDRESS

Для

bind-address = 0.0.0.0

Это позволит пользователю с localhost И даже снаружи (в моем случае) подключиться к экземпляру. Обе ниже разрешения будут работать, если вы привяжете MySQL к 0.0.0.0:

[email protected]_NAME_OR_IP

[email protected]

Ответ 7

В моем случае

  • Измените конфигурацию mysql удаленного компьютера на /etc/mysql/my.cnf: change bind-address = 127.0.0.1 в #bind-address = 127.0.0.1

  • На удаленном компьютере измените права пользователя mysql с помощью GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password';

  • ВАЖНО: перезапустите mysql на удаленном компьютере: sudo /etc/init.d/mysql restart

Ответ 8

Для меня решение заключалось в том, чтобы изменить в файле conf mysql server параметр bind-address = "127.0.0.1" или bind-address = "x.x.x.x" на bind-address = "0.0.0.0". Спасибо.

Ответ 9

Если у вас возникла проблема с набором контейнеров Docker, убедитесь, что вы не только EXPOSE порт 3306, но также сопоставляете порт со стороны контейнера -p 3306:3306. Для docker-compose.yml:

version: '2'

services:
    mdb:
        image: mariadb:10.1
        ports:
            - "3306:3306"
        …

Ответ 10

Это случается (в моем случае), когда для MySQL недостаточно памяти. Перезапуск исправляет его, но если этот случай рассматривает nachine с большим объемом памяти или ограничивает память, полученную jvms

Ответ 11

Перейдите в службы Windows на панели управления и запустите службу MySQL. Для меня это сработало. Когда я выполнял проект Java EE, я получил эту ошибку "Ошибка связи". Я перезапустил свою систему, а потом сработал.

После этого я снова получил ту же ошибку даже после перезагрузки моей системы. Затем я попытался открыть консоль командной строки MySQL и войти в систему с помощью root, даже тогда это дало мне ошибку.

Наконец, когда я запустил службу MySQL из служб Windows, она сработала.

Ответ 12

Было то же самое. Удаление порта помогло в моем случае, поэтому я оставил его как jdbc: mysql://localhost/

Ответ 13

Если вы используете спящий режим, эта ошибка может быть вызвана тем, что для открытия объекта сеанса больше времени, чем wait_timeout

Я зарегистрировал случай в здесь для тех, кто заинтересован.

Ответ 14

Я нашел решение

поскольку MySQL нужен для работы в Localhost.

перейдите в файл /etc/network/interfaces и убедитесь, что у вас установлена ​​локальная конфигурация:

auto lo
iface lo inet loopback

СЕЙЧАС RESTART подсистему Networking и службы MySQL:

sudo/etc/init.d/networking restart

sudo/etc/init.d/mysql restart

Попробуйте сейчас

Ответ 15

Это в основном из-за слабой связи между клиентом mysql и удаленным сервером mysql.

В моем случае это из-за flaky VPN-соединения.

Ответ 16

В опции драйвера phpstorm + vagrant autoReconnect помогли.

Ответ 17

Решение, предоставленное Soheil, было успешным в моем случае.

Чтобы уточнить, единственное изменение, которое мне нужно было сделать, это конфигурация сервера MySQL;

bind-address = **INSERT-IP-HERE**

Я использую внешний MySQL-сервер для своего приложения. Это базовая установка Debian 7.5 с MySQL Server 5.5 - настройка по умолчанию.

ВАЖНО:

Всегда создавать резервные копии файлов конфигурации, которые вы можете изменить. Всегда будьте осторожны, когда вы становитесь суперпользователем.

Файл

/etc/mysql/my.cnf

Линия

bind-address        = 192.168.0.103 #127.0.0.1

Перезапустите службу MySQL Server:

/usr/sbin/service mysql restart

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

Спасибо @Soheil

Ответ 18

У меня возникла аналогичная проблема, и решение для моего случая было

  • change bind-address = 0.0.0.0 от 127.0.0.1
  • изменение url localhost на localhost: 3306

вещь, которую я чувствовал, мы никогда не должны сдаваться, я пробовал все варианты с этой должности и с других форумов, а также... happy it works @saurab

Ответ 19

Я тоже столкнулся с этой проблемой.

Как предложил Сохейл, Я отправился в файл php.ini по пути C:\windows\php.ini, затем я пересмотрел номер порта в этом файле.

он находится в строке mysqli.default_port =..........

Итак, я изменил его в своем приложении java, как и в файле php.ini, теперь он отлично работает со мной.

Ответ 20

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

Я разрабатываю кросс-платформенное приложение для Windows, но для использования на серверах Linux и Windows.

База данных MySQL, называемая "jtm", установлена ​​в обеих системах. По какой-то причине в моем коде у меня было имя базы данных как "JTM". В Windows это работало нормально, ведь на нескольких системах Windows он летал.

В Ubuntu я снова и снова получал ошибку. Я проверил его с правильным кодом в коде "jtm", и он работает.

Linux, очевидно, намного менее прощает вопрос чувствительности к регистру (справедливо), тогда как Windows делает скидку.

Теперь я чувствую себя немного глупо, но все проверю. Сообщение об ошибке не лучший, но это, кажется, поправимо, если вы упорно и получить все правильно.

Ответ 21

Я только что перезапустил MySQL (после подсказки отсюда: fooobar.com/questions/46259/...), и он решил проблему.

У меня была такая же проблема на MacOS (10.10.2) и MySql (5.6.21), установленном через homebrew.

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

После многих попыток приложения, которое исключило исключение com.mysql.jdbc.CommunicationsException, как было предложено принятым ответом на этот вопрос, ничего не получилось, я был удивлен, что перезагрузка MySQL сработала.

Причиной моей проблемы могло быть следующее, как было предложено в ответе в вышеупомянутой ссылке:

Используете ли вы пул соединений? Если да, попробуйте перезапустить сервер. Вероятно, несколько соединений в вашем пуле соединений находятся в закрытом состоянии.

Ответ 22

Для Windows: - Откройте меню "Пуск", напишите "Мастер настройки экземпляра MySqlserver" и перенастройте экземпляр сервера mysql. Надеюсь, что это решит вашу проблему.

Ответ 23

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

установить глобальный wait_timeout = 3600;
установить global interactive_timeout = 230400;

Не забудьте сделать это постоянным, если оно работает для вас.

Ответ 24

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

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

Итак, проверьте, правильно ли работает сервер MySQL.

Ответ 25

Если вы используете локальный эмулятор, вам нужно использовать IP-адрес 10.0.2.2 вместо localhost для доступа к локальному серверу MySQL.