it-roy-ru.com

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?");
    }
}
163
Josh K

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

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

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

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

  1. IP-адрес или имя хоста в URL JDBC неверны.
  2. Имя хоста в URL JDBC не распознается локальным DNS-сервером.
  3. Номер порта отсутствует или неверен в URL JDBC.
  4. Сервер БД не работает.
  5. Сервер БД не принимает соединения TCP/IP.
  6. На сервере БД закончились соединения.
  7. Что-то среднее между Java и DB блокирует соединения, например брандмауэр или прокси . 

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

  1. Проверьте и проверьте их с помощью ping.
  2. Обновите DNS или используйте IP-адрес в URL JDBC.
  3. Проверьте это на основе my.cnf базы данных MySQL.
  4. Запустите БД.
  5. Убедитесь, что mysqld запущен без --skip-networking option.
  6. Перезапустите БД и исправьте ваш код соответствующим образом, чтобы он закрывал соединения в finally.
  7. Отключите брандмауэр и/или настройте брандмауэр/прокси для разрешения/переадресации порта . 

Смотрите также:

210
BalusC

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

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

7
user1694306

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

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

7
Yogesh Funde

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

 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");

Замена Localhost на ваш IP-адрес

6
sureshAngamuthu

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

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

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

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

Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);
5
Abdul Rahim Mohamad

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

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

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

mysql -u username -p

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

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

5
Karl Walsh

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

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

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

3
user3251882

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

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

3
rs2012

Загрузите MySQL-JDBC-Type-4-Treiber (например, «mysql-connector-Java-5.1.11-bin.jar» из «mysql-connector-Java-5.1.11.Zip») в Mysql .

Вы должны включить jar драйвера во время компиляции и выполнения в вашем classpath.

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" );
3
stacker

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

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

3
shellbye

Пожалуйста, обновите ваш IP-адрес в файле /etc/mysql/my.cnf

bind-address  = <IP_ADDRESS>

Перезапустите сервисы mysql daemon и mysql.

3
Sreedhar GS

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

2
xrcwrn

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

2
Maheshkumar.V

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

2
Dario Castro

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

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

    vi /etc/mysql/my.cnf 

  2. изменить свой bind-адрес

    "#bind-address = 127.0.0.1"

  3. перезапустите MySQL

    Sudo /etc/init.d/mysql restart

2
Haimei

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

2
MrPencil

Просто пережил это.

Должен заставить это работать: (Это может быть помещено в статический блок инициализатора)

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");

С уважением.

2
mel3kings

Для Remote Позвонить в 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'
    
1
Yugerten

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

0
m Piroli

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

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

А вот и вывод telnet localhost 3306:

$ telnet localhost 3306
Trying ::1...

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

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

0
Haozhe Xie

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

Загрузка класса com.mysql.jdbc.Driver'. This is deprecated. The new driver class iscom.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>

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

0
hestellez

В моем случае мне пришлось установить 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
Tech Nomad

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

0
Michal Šípek

Я получал несколько ошибок, таких как:

  • CommunicationsException: Communications link failure 
  • Java.lang.NullPointerException: Attempt to invoke interface method 'Java.sql.Statement Java.sql.Connection.createStatement()' on a null object reference at.

Я должен был добавить:

  • В AndroidManifest.xml включайте <uses-permission Android:name="Android.permission.INTERNET"/> сразу после открывающего тега manifest.

  • Добавьте драйвер JDBC в ваши зависимости Gradle (или Maven).

0
Daniel Segura

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

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

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

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
ShivBuyya

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

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
Prakhar Agrawal

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

0
Ankit Jain

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

Удачи!

0
shivam gupta

У меня та же ошибка соединения: у меня проблема в том, что я использовал MySQL 8.0.15, но Java Connector - 5.x.x.

Ниже показано, как enter code here я это исправил. 1. скачать 8.0.15. из репозитория Maven: https://search.maven.org/search?q=g:mysql%20AND%20a:mysql-connector-Java

  1. В Eclipse IDE выберите «Библиотеки со ссылками» в проводнике правой кнопкой мыши> Путь сборки> Настроить путь сборки a. удалите "mysql-connector-5.x.jar" б. Нажмите «Добавить внешние файлы JAR ...» и выберите mysql-connector-Java-8.0.15.jar.

Перезапустите его, проблема ушла. \

0
Peter Chen

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

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

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

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

0
Abdul Khalid

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

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

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

0
user3427633