com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: сбой линии связи

159

Я работаю над тем, чтобы моя база данных говорила с моими Java-программами.

Может ли кто-нибудь дать мне быструю и грязную программу-образец с помощью JDBC?

Я получаю довольно грозную ошибку:

Exception in thread "main" 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:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2260)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:787)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49)
    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:409)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:207)
    at SqlTest.main(SqlTest.java:22)
Caused by: 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:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2181)
    ... 12 more
Caused by: java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
    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:256)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:293)
    ... 13 more

Содержимое тестового файла:

import com.mysql.jdbc.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SqlTest {

    public static void main(String [] args) throws Exception {
        // Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
        // // edit the jdbc url 
        Connection conn = DriverManager.getConnection( 
            "jdbc:mysql://localhost:3306/projects?user=user1&password=123");
        // Statement st = conn.createStatement();
        // ResultSet rs = st.executeQuery( "select * from table" );

        System.out.println("Connected?");
    }
}
  • 11
    Я был глупым. Сервер MySQL не был запущен :( После запуска он прошел успешно.
Теги:
jdbc

32 ответа

214
Лучший ответ

Итак, у вас есть

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи связи
java.net.ConnectException: соединение отклонено

Я цитирую этот ответ, который также содержит пошаговое руководство по MySQL + JDBC:

Если вы получаете SQLException: Connection refused или Connection timed out или специфический для MySQL CommunicationsException: Communications link failure, то это означает, что БД вообще недоступна. Это может иметь одну или несколько следующих причин:

  • Неверный 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 option.
  • Перезагрузите базу данных и исправьте свой код соответствующим образом, чтобы он закрывал соединения в finally.
  • Отключите брандмауэр и/или настройте брандмауэр/прокси для разрешения/пересылки порта.

См. также:

  • 4
    MAMP / MAMP Pro по умолчанию устанавливает MAMP_skip-network_MAMP. Вы должны отключить эту строку в вашем my.cfn
  • 5
    Не в этом случае, но сбой линии связи также происходит, когда вы используете пул соединений и соединения закрыты из-за длительного бездействия. Только в этом случае он говорит: «Последний пакет был получен несколько« Х »секунд назад»
Показать ещё 5 комментариев
7

Это исключение com.mysql.jdbc.exceptions.jdbc4.CommunicationsException возникает, если соединение с базой данных простаивает долгое время.

Это бездействующее соединение возвращает true на connection.isClosed();, но если мы попытаемся выполнить оператор, то оно запустит это исключение, поэтому я предлагаю пойти с пулом базы данных.

  • 1
    Это также происходит по другим причинам, таким как «отказано в соединении».
7

Я поймаю это исключение, когда Java из кучи. Если я попытаюсь поместить в ОЗУ множество элементов данных - сначала поймаю Сбой связи "и далее" OutOfMemoryError ".

Я зарегистрировал его, и я уменьшаю потребление памяти (удаляю 1/2 данных) и все нормально.

6

Это лучшее решение,

 Connection con = DriverManager.getConnection(
 "jdbc:mysql://localhost:3306/DBname", "root", "root");

 Connection con = DriverManager.getConnection(
 "jdbc:mysql://192.100.0.000:3306/DBname", "root", "root");

Замена локального хоста на ваш IP-адрес

  • 0
    Последнее обновление 5/5/18: В настоящее время я использую MySQL Workbench 6.3. Я пришел сюда, чтобы проверить решение, но нашел его самостоятельно, просто ваш сервер MySQL не запущен или остановлен. Я перезапустил свой сервер, он работал как шарм.
  • 4
    Это «лучшее решение», почему? Какую проблему это решает и как?
5

У меня была такая же проблема часами. Я использую сервер MAMP

Вместо использования localhost: [Apache Port] используйте ваш порт MySQL.

Ниже представлен порт MySQL по умолчанию для сервера MAMP.

String url = "jdbc:mysql://localhost:8889/db_name";

Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);
  • 0
    если у вас есть mamp до установки Mysql, попробуйте этот метод
5

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

Исключение в потоке "main" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи. Последний пакет, успешно отправленный на сервер, был 0 миллисекунд назад. Драйвер не получил никаких пакетов с сервера. на...

Что произойдет, если вы попробуете (из терминала)

mysql -u username -p

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

Возможно, вам придется запустить MySQL из настроек, если нет. Вы также можете установить его для запуска при запуске.

  • 1
    Я использую MAMP для запуска моего сервера MySQL. Это будет проблемой?
  • 0
    Когда я подключаюсь (через Sequal Pro) к своему localhost я использую правильное имя пользователя / пароль, и он работает нормально.
3

Более ранние ответы подходят. Но я также хотел бы указать на более общую проблему.

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

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

3

В моем случае, оказалось, что версия mysql-connector-java была высокой.

В моей демонстрации я как-то использую mysql-connector-java следующим образом:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.9</version>
</dependency>

Но в среде разработки я использую это:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.31</version>
</dependency>

И моя версия MySQL была 5.1.48 (да, она устарела, просто для имитации версии продукта). Поэтому я встретил ту же ошибку.

Поскольку причина найдена, решение также найдено. Сопоставьте версию!

  • 2
    Навряд ли. Все эти версии драйверов должны быть обратно совместимыми.
3

Обновите свой IP-адрес в файле /etc/mysql/my.cnf

bind-address  = <IP_ADDRESS>

Перезапустите службы mysql deamon и mysql.

3

У меня такая же ошибка, потому что я пытался запустить свою программу без запуска сервера mysql.

После запуска сервера mysql все пошло правильно.

3

Загрузите MySQL-JDBC-Type-4-Treiber (ig 'mysql-connector-java-5.1.11-bin.jar' из 'mysql-connector-java-5.1.11.zip') в Mysql.

Вам нужно задействовать кувшин драйвера во время компиляции и выполнения в вашем пути к классам.

Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
// edit the jdbc url 
Connection conn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", username, password );
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery( "select * from table" );
  • 0
    Нет, дает мне кучу ошибок о том, что я ничего не нашел. Можно ли будет импортировать это без файла JAR?
  • 0
    @ Боже, это работает, тебе просто нужно правильно настроить путь к классам. (Или скопируйте jar в ваш каталог% JAVA_HOME% \ jre \ lib \ ext, но это считается плохой практикой)
2

Это случилось со мной, когда я изменил порт mysql с 3306 на 3307 в файлах my.ini и php.ini, но после изменения портов (3307- > 3306) он снова работал отлично.

2

Я решил эту проблему простым способом, который сработал у меня. У меня проблема с семей "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи связи". В моем файле db.properties у меня было это: url: jdbc: mysql://localhost: 90/myDB, только удалил URL-адрес порта, в результате чего появился url: jdbc: mysql://localhost/myDB, и это сработало для меня.

2

Если вы изменили свой порт, вы получите такую ​​ошибку: "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи связи" Проверьте номер порта

2

Если вы используете сервер WAMP или XAMP для установки базы данных mysql. Затем вы должны явно запустить mysql sever другим, чтобы он показывал com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure при подключении к базе данных

2

Моя же проблема решается следующими шагами:

  • перейти к my.cnf

    vi /etc/mysql/my.cnf

  • изменить свой адрес привязки

    "#bind-address = 127.0.0.1"

  • перезапустить mysql

    sudo /etc/init.d/mysql restart

2

Просто испытал это.

Чтобы сделать его работу: (это может быть помещено в статическом блочном intializer)

static{ // would have to be surrounded by try catch
    Class.forName("com.mysql.jdbc.Driver");   // this will load the class Driver
}

Также, получив соединение через:

conn = DriverManager.getConnection(DBURL,<username>,<password>);

вместо указания параметров входа

  Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/projects?user=user1&password=123");

С уважением.

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

Для удаленного звонка на Mysql

  1. Добавьте удаленного пользователя в Mysql для примера IP = remoteIP:

    mysql -u xxxx -p //local coonection to mysql
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'theNewUser'@'remoteIP' IDENTIFIED BY 'passWord';
    //Query OK, 0 rows affected (xx sec)
    mysql> FLUSH PRIVILEGES;
    //Query OK, 0 rows affected
    
  2. Разрешить удаленный доступ к Mysql (по умолчанию все внешние вызовы не разрешены):

    Edit 
    /etc/mysql/mysql.conf.d/mysqld.cnf    or    /etc/mysql/my.cnf
    Change line:  bind-address = 127.0.0.1   to
                  #bind-address = 127.0.0.1
    Restart Mysql: /etc/init.d/mysql restart
    
  3. Для последней версии драйвера JDBC, JDBC:

    jdbc.url='jdbc:mysql://remoteIP:3306/yourDbInstance?autoReconnect=true&amp;useUnicode=true&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC'
    jdbc.user='theNewUser'
    
0

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

[08S01] 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.

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

0

Откройте файл /etc/mysql/my.cnf: измените параметр ниже из

bind-address = 127.0.0.1 to bind-address = 192.168.0.3 #this is your local system IP Address,

Запустите команду ниже в mysql для определенного IP Address->

grant all privileges on dbname.* to [email protected]'192.168.0.3' IDENTIFIED BY 'dbpassword';                      

Если вы хотите дать доступ ко всем IP-адресам, выполните следующую команду:

grant all privileges on dbname.* to [email protected]'%' IDENTIFIED BY 'dbpassword'; 
0

Я столкнулся с той же проблемой, когда я запускал свое приложение,

Caused by: 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 /etc/mysql/mysql.conf.d/mysqld.cnf конфигурация была такой

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error       = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address    = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

Итак, как мы видим, что адрес связывания указывает на 127.0.0.1, поэтому для запуска вашего приложения простое решение заключается в том, что мы можем использовать jdbc: mysql://127.0.0.1: 3306/pizzeria вместо jdbc: mysql://localhost: 3306/pizzeria, который подключит mysql к приложению или другому решению, состоит в том, что вы можете проверить и изменить конфигурации mysql на default. Оба решения могут работать. Я надеюсь, что это сработает и для вас, ребята.

0

В моем MacBook я решил эту ошибку только при переустановке новой версии eclipse EE и удалении локальных серверов, таких как xamp mysql или mamp, но использую только один из них...

0

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

0

Он пытался подключиться к более старой версии MySQL ('version', '5.1.73'); когда вы используете более новую версию драйвера, вы получаете сообщение об ошибке "com.mysql.cj.jdbc.Driver" или даже то, что вам не нужно указывать, какой драйвер вы используете:

Загрузка класса com.mysql.jdbc.Driver'. This is deprecated. The new driver class is com.mysql.jdbc.Driver'. This is deprecated. The new driver class is com.mysql.jdbc.Driver'. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver '. Драйвер автоматически регистрируется через SPI, и ручная загрузка класса драйвера обычно не требуется.

Я изменил объявление, чтобы использовать версию mysql-connector-java 5.1.38, и в коде я сохранил com.mysql.jdbc.Driver.

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.38</version>
</dependency>

Все началось, когда я увидел ответ Ankit Jain

0

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

Чтобы решить проблему подключения, мне пришлось отключить ( + F2 с использованием ключевых привязок по умолчанию на маке) и снова подключиться. Просто нажать "Обновить" было недостаточно.

0

То, что для меня решило, делает 2 вещи:  1. Создайте нового пользователя, отличного от root, с помощью некоторого пароля, используя следующие команды:

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';
FLUSH PRIVILEGES;

2. комментарий IP-адрес строки на mysqld.conf

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

0

Возможно, вы не запустили свой Mysql и Apache Server. После того как я запустил сервер Apache и Mysql из панели управления XAMPP, соединение было успешно установлено.

Удачи!

0

Попробуйте изменить localhost на 127.0.0.1.

Локальный хост будет разрешен ::1. И MySQL не может быть подключен через IPv6 по умолчанию.

И вот вывод telnet localhost 3306:

$ telnet localhost 3306
Trying ::1...

И от сервера MySQL нет ответа.

Конечно, убедитесь, что ваш сервер MySQL запущен.

0

Если есть какие-либо читатели, которые столкнулись с этой проблемой для доступа к удаленному серверу: убедитесь, что порт открыт

0

Это может быть простая проблема с jar. Возможно, вы используете старый mysql-connector-java-XXX-bin.jar, который не поддерживается текущей версией mysql. Я использовал mysql-connector-java-5.1.18-bin.jar, поскольку я использую mysql 5.5, и эта проблема разрешена для меня.

  • 1
    Да, может быть шанс несоответствия банок.
  • 0
    Все эти версии драйверов должны быть совместимы.
0

У меня была та же проблема, и вот как она была исправлена:

  • My.jsp вызывал атрибуты, которые я еще не определил в сервлета.
  • У меня было два имени столбца, которое я передавал в объект через ResultSet (getString("columnName")), который не соответствовал именам столбцов в моей базе данных.

Я не совсем уверен, какой из них исправил проблему, но это сработало. Кроме того, убедитесь, что вы создаете новые Statement и ResultSet для каждого запроса таблицы.

  • 1
    (1), конечно, не вызывает этой проблемы.
-3

Также ваш сервер может быть просто закрыт. На Mac перейдите на панель настроек mySQL через прожектор. Если там, установите флажок, чтобы запустить сервер при запуске компьютера и запустить сервер.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню