com.для MySQL.интерфейс jdbc.исключения.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

содержимое файла test:

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

26 ответов


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

com.для MySQL.интерфейс jdbc.исключения.jdbc4.CommunicationsException: сбой канала связи
java.сеть.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 DB.
  4. запустите DB.
  5. Проверьте, запущен ли mysqld без --skip-networking option.
  6. перезагрузите БД и исправьте код соответственно, он закрывает соединения в finally.
  7. отключить брандмауэр и/или настроить брандмауэр/прокси для разрешения / пересылки порта.

Читайте также:


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

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


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

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


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

исключение в потоке "main" com.для MySQL.интерфейс jdbc.исключения.jdbc4.CommunicationsException: Связь failureThe последний пакет успешно отправлено на сервер был 0 миллисекунды назад. Водитель не получил никаких пакетов от сервера. на...

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

mysql -u username -p

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

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


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

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

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

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

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

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

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


скачать MySQL-подключение JDBC-Тип-4-Трайбер (я.г. 'в MySQL-разъем-Java с-5.1.11-Бен.банку " с " в MySQL-разъем-Java с-5.1.11.молния') в в MySQL.

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

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

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

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


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

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


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

bind-address  = <IP_ADDRESS>

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


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

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

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


только что испытал это.

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

С уважением.


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


моя же задача решается следующим образом:

  1. иди ко мне.cnf

    vi /etc/mysql/my.cnf

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

    "#bind-address = 127.0.0.1"

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

    sudo /etc/init.d/mysql restart


Я решил эту проблему простым способом, это сработало для меня. у меня была проблема с семами "com.для MySQL.интерфейс jdbc.исключения.jdbc4.CommunicationsException: сбой канала связи". В моей БД.свойства файла надо было так : URL-адрес:в JDBC:MySQL базы://локальный:90/базы данных mydb, только удалил url порта, в результате чего таким образом url: jdbc: mysql:/ / localhost / myDB и это сработало для меня.


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


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


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

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

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


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


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

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

и вот результат telnet localhost 3306:

$ telnet localhost 3306
Trying ::1...

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

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


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

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

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

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


он пытался подключиться к более старой версии MySQL ('version', '5.1.73' ); при использовании более новой версии драйвера вы получаете сообщение об ошибке, которое говорит вам использовать "com.для MySQL.СиДжея.интерфейс jdbc.Водитель!--4--> или даже, что вы не должны especify, которые вы используете:

загрузка класс com.mysql.jdbc.Driver'. This is deprecated. The new driver class is com.для MySQL.СиДжея.интерфейс jdbc.Водитель". Водитель автоматически регистрируется через SPI и ручную загрузку драйвера класс, как правило, не нужен.

I изменил объявление на использование версии 5.1.38 mysql-connector-java и, в коде, я сохранил com.для MySQL.интерфейс jdbc.Водитель!--4-->.

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

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


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


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


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

удачи!


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

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