com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: сбой линии связи - PullRequest
182 голосов
/ 06 июня 2010

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

Ответы [ 33 ]

218 голосов
/ 06 июня 2010

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

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

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

9 голосов
/ 16 мая 2013

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

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

8 голосов
/ 12 марта 2014

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

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

7 голосов
/ 26 февраля 2015

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

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

5 голосов
/ 30 апреля 2015

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

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

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

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

Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);
5 голосов
/ 02 июля 2015

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

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

5 голосов
/ 06 июня 2010

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

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

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

mysql -u username -p

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

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

4 голосов
/ 12 апреля 2014

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

bind-address  = <IP_ADDRESS>

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

4 голосов
/ 22 декабря 2016

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

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

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

3 голосов
/ 02 июня 2014

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

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

    vi /etc/mysql/my.cnf

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

    "#bind-address = 127.0.0.1"

  3. перезапустить mysql

    sudo /etc/init.d/mysql restart

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...