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

Я работаю над тем, чтобы моя база данных говорила с моими 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?");
    }
}

Ответ 1

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

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.
  • Отключите брандмауэр и/или настройте брандмауэр/прокси для разрешения/пересылки порта.

См. также:

Ответ 2

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

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

Ответ 3

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

 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-адрес

Ответ 4

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

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

Ответ 5

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

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

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

mysql -u username -p

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

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

Ответ 6

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

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

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

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

Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);

Ответ 7

В моем случае оказалось, что версия 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 (да, она старая, просто для имитации версии продукта). Поэтому я встретил ту же ошибку.

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

Ответ 8

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

bind-address  = <IP_ADDRESS>

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

Ответ 9

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

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

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

Ответ 10

Загрузите 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" );

Ответ 11

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

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

Ответ 12

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

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

    vi /etc/mysql/my.cnf

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

    "#bind-address = 127.0.0.1"

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

    sudo /etc/init.d/mysql restart

Ответ 13

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

Чтобы сделать его работу: (это может быть помещено в статическом блочном 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");

С уважением.

Ответ 14

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

Ответ 15

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

Ответ 16

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

Ответ 17

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

Ответ 18

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

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

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

$ telnet localhost 3306
Trying ::1...

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

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

Ответ 19

Для удаленного звонка на 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'
    

Ответ 20

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

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

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

Ответ 21

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

Ответ 22

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

Удачи!

Ответ 23

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

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

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

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

Ответ 24

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

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

Ответ 25

Он пытался подключиться к более старой версии 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

Ответ 26

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

Ответ 27

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

Ответ 28

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

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. Оба решения могут работать. Я надеюсь, что это сработает и для вас, ребята.

Ответ 29

Откройте файл /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'; 

Ответ 30

В моем случае мне пришлось установить 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 и вуаля, это сработало!