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



답변

그래서, 당신은

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : 통신 링크 실패
java.net.ConnectException : 연결 거부

이 답변 에서 단계별 MySQL + JDBC 자습서가 포함되어 있습니다.

당신이 얻을 경우 SQLException: Connection refusedConnection timed out또는 MySQL의 특정을 CommunicationsException:
Communications link failure
, 다음은 DB가 전혀 도달 할 수없는 것을 의미한다. 다음 원인 중 하나 이상이 발생할 수 있습니다.

  1. JDBC URL의 IP 주소 또는 호스트 이름이 잘못되었습니다.
  2. 로컬 DNS 서버가 JDBC URL의 호스트 이름을 인식하지 못합니다.
  3. JDBC URL에서 포트 번호가 누락되었거나 잘못되었습니다.
  4. DB 서버가 다운되었습니다.
  5. DB 서버는 TCP / IP 연결을 허용하지 않습니다.
  6. DB 서버에 연결이 부족합니다.
  7. Java와 DB 사이에 방화벽이나 프록시와 같은 연결이 차단되고 있습니다.

둘 중 하나를 해결하려면 다음 조언을 따르십시오.

  1. 로 확인하고 테스트하십시오 ping.
  2. 대신 DNS를 새로 고치거나 JDBC URL에서 IP 주소를 사용하십시오.
  3. my.cnfMySQL DB를 기반으로 확인하십시오 .
  4. DB를 시작하십시오.
  5. mysqld가 --skip-networking option. 없이 시작되었는지 확인하십시오 .
  6. DB를 다시 시작하고에서 연결을 닫도록 코드를 수정하십시오 finally.
  7. 방화벽을 비활성화하거나 포트를 허용 / 전달하도록 방화벽 / 프록시를 구성하십시오.

또한보십시오:


답변

Java에서 힙이 부족할 때이 예외가 발생합니다. RAM에 많은 데이터 항목을 넣으려고하면 먼저 ” 통신 링크 실패 “와 ” OutOfMemoryError “를 잡습니다 .

나는 그것을 기록했고 메모리 소비를 줄였다 (1/2 데이터 삭제).


답변

필자의 경우 Localhost를 실제 데이터베이스 서버 IP 주소로 교체해야했습니다.

대신에

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


답변

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException데이터베이스 연결이 오랫동안 유휴 상태 인 경우이 예외가 발생합니다.

이 유휴 연결은 true를 반환 connection.isClosed();하지만 명령문을 실행하려고하면이 예외가 발생하므로 데이터베이스 풀링을 사용하는 것이 좋습니다.


답변

몇 시간 동안 같은 문제가 발생했습니다. MAMP Server를 사용하고 있습니다

localhost : [Apache Port]를 사용하는 대신 MySQL 포트를 사용하십시오.

아래는 MAMP 서버의 기본 MySQL 포트입니다.

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

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


답변

여기서 잘못된 트리를 짖을 수도 있지만 예외는 MySQL 서버를 사용할 수 없음을 나타내는 것 같습니다.

“main”스레드의 예외 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : 통신 링크 실패 서버에 성공적으로 전송 된 마지막 패킷은 0 밀리 초 전입니다. 드라이버가 서버로부터 패킷을받지 못했습니다. 에서…

터미널에서 시도하면 어떻게됩니까?

mysql -u username -p

사용자 이름과 관련된 비밀번호를 묻는 메시지가 나타납니다. 올바른 비밀번호를 입력하면 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이었습니다 (예, 제품 버전을 모방하기 위해 오래되었습니다). 그래서 같은 오류가 발생했습니다.

이유가 발견되었으므로 솔루션도 발견됩니다. 버전과 일치하십시오!