programing

com.bc.jdbc.exceptions.jdbc4 를 지정합니다.통신예외:통신 링크 장애

lovecodes 2022. 7. 28. 23:49
반응형

com.bc.jdbc.exceptions.jdbc4 를 지정합니다.통신예외:통신 링크 장애

데이터베이스와 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.com.bc.jdbc.exceptions.jdbc4 입니다 신신" link failure" (커뮤니케이션링크 )
java.net.java.net 에 연결 예외:되었습니다.

MySQL+JDBC 튜토리얼도 단계별로 수록되어 있는 이 답변에서 인용합니다.

에 ''가요.SQLException: Connection refused ★★★★★★★★★★★★★★★★★」Connection timed out 고유의 "MySQL"CommunicationsException: Communications link failureDB를 사용합니다.여기에는 다음 중 하나의 원인이 있을 수 있습니다.

  1. JDBC URL의 IP 주소 또는 호스트 이름이 잘못되었습니다.
  2. JDBC URL의 호스트 이름이 로컬 DNS 서버에서 인식되지 않습니다.
  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. 방화벽을 비활성화하거나 포트를 허용/전송하도록 방화벽/프록시를 설정합니다.

다음 항목도 참조하십시오.

제 경우 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");

이 예외는 Java가 힙을 벗어났을 때 발생합니다.RAM에 많은 데이터 항목을 넣으려고 하면 먼저 "통신 링크 장애"가 표시되고 다음으로 "Out Of Memory Error"가 표시됩니다.

로그로 기록했더니 메모리 사용량을 줄였습니다(데이터 1/2 삭제).

★★★★★★★★★★★★★★★★★.com.mysql.jdbc.exceptions.jdbc4.CommunicationsException데이터베이스 연결이 장시간 유휴 상태인 경우 예외가 발생합니다.

됩니다.connection.isClosed();그러나 스테이트먼트를 실행하려고 하면 이 예외가 발생하므로 데이터베이스 풀링을 권장합니다.

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★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(예, 오래된 버전입니다.제품 버전을 모방한 것일 뿐입니다).그래서 나는 같은 오류를 만났다.

원인을 찾았기 때문에 해결책도 찾을 수 있습니다.버전 매칭!

이 경우 다음과 같이 예상된 TLS 프로토콜을 연결 문자열에 추가하는 것이 해결책이었습니다.

jdbc:mysql://localhost:3306/database_name?enabledTLSProtocols=TLSv1.2

몇 시간째 같은 문제를 겪고 있어요.MAMP 서버를 사용하고 있다

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에 예외가 있습니다.통신예외:통신 링크 장애서버에 정상적으로 송신된 마지막 패킷은 0밀리초 전입니다.드라이버가 서버로부터 패킷을 수신하지 않았습니다.

(단말기에서) 시도하면 어떻게 됩니까?

mysql -u username -p

사용자 이름과 관련된 비밀번호를 입력하라는 메시지가 나타납니다.올바른 비밀번호를 입력하면 mysql 클라이언트는 접속합니까?

그렇지 않은 경우 기본 설정에서 MySQL을 시작해야 할 수 있습니다.기동시에 실행하도록 설정할 수도 있습니다.

앞의 답변이 적절합니다만, 보다 일반적인 문제도 지적하고 싶습니다.

저도 비슷한 문제에 직면했는데, 그 이유는 회사의 네트워크 제한이었습니다.

다른 네트워크에서도 같은 접속이 성공하고 있었습니다.

이 에러는 Java가 SSL을 통해 MySQL에 접속하려고 해도 문제가 발생할 수 있습니다(내 경우 Payara Server 5.193.1 접속 풀을 MySQL로 설정하고 있었습니다).

은 setting setting some some some 。useSSL=false Connector/J부터 Connector/J 버전까지8.0.13이 설정은 권장되지 않습니다.다음은 MySQL Connector/J 8.0 구성 속성에서 발췌한 것입니다.

ssl 모드

기본적으로는 네트워크 연결은 SSL로 암호화됩니다.이 속성을 통해 보안 연결을 끄거나 다른 수준의 보안을 선택할 수 있습니다.수 있는 은 다음과 같습니다.DISABLED되지 않은을 확립합니다. - 암호화되지 않은 연결을 확립합니다.PREFERRED (하게 했을 된 접속을 확립합니다 않으면 되지 않은 .- ( ) 。REQUIRED 되어 있는 그렇지 경우 연결을 확립합니다.- 시큐어 연결을 확립하지 않으면 실패합니다.VERIFY_CA요 - 좋아요REQUIRED, 서버 TLS Authority( 인증국하여 확인합니다.「 」 、 [ TLS ] 、 [ CA ] 。VERIFY_IDENTITY요 - 좋아요VERIFY_CA단, 서버 증명서가 접속을 시행하는 호스트와 일치하는지 확인합니다.

은 폐지된 속성인 "Regacy Properties"를 대체했습니다.useSSL,requireSSL , , , , 입니다.verifyServerCertificate이 값은 여전히 허용되지만 다음 값으로 변환됩니다.sslModesslMode으로 설정되어 있지 않습니다.useSSL=false됩니다.sslMode=DISABLED{"useSSL=true", "requireSSL=false", "verifyServerCertificate=false"}됩니다.sslMode=PREFERRED{"useSSL=true", "requireSSL=true", "verifyServerCertificate=false"}됩니다.sslMode=REQUIRED{"useSSL=true" AND "verifyServerCertificate=true"}됩니다.sslMode=VERIFY_CA에하는 레거시 설정은 .sslMode=VERIFY_IDENTITY. 설정인 "는 "Default"입니다sslModePREFERRED인 에 합니다.useSSL=true,requireSSL=false , , , , 입니다.verifyServerCertificate=falseConnector/J 8.0.12 입니다.레거시 속성을 계속 사용하고 이전 기본 설정에 의존하는 응용 프로그램은 검토해야 합니다.

레거시 속성은 다음 경우 무시됩니다.sslMode명시적으로 설정되어 있습니다. 쪽도 없는 sslMode ★★★★★★★★★★★★★★★★★」useSSL명시적으로 , 설정인 「Default Settings(디폴트 설정)」은 「Default Settings(디폴트 설정)」입니다.기본 설정은sslMode=PREFERRED용됩니니다다

디폴트:PREFERRED

버전 : 8.0.13 이후

저 래, 우, 팅, 팅을 설정하고 .sslMode=DISABLED.을 사용하도록 와 MySQL 입니다.그러나 운영 환경에서는 Java 클라이언트와 MySQL 서버가 SSL을 사용하도록 적절하게 구성되어야 합니다.


, 를 설정할 에 주의해 .allowPublicKeyRetrieval=true(이것 역시 보안의 관점에서 현명한 결정은 아닙니다.)자세한 내용은 MySQL ConnectionString Options를 참조하십시오.

Allow Public Key Retrieval(공개 키 취득 허용)

이 " " " 를 사용하는 sha256_password인증에서는, 패스워드는 송신중에 보호될 필요가 있습니다.TLS가 권장되는 메커니즘이지만, 이 메커니즘을 사용할 수 없는 경우는 RSA 공개 키 암호화가 사용됩니다.키를 하려면 , 「RSA」를 합니다.ServerRSAPublicKeyFile 설정 set " " " " " " " " "AllowPublicKeyRetrieval=True클라이언트가 서버에서 공용 키를 자동으로 요구할 수 있도록 합니다.:AllowPublicKeyRetrieval=True는 악성 프록시가 MITM 공격을 실행하여 플레인텍스트 비밀번호를 취득할 수 있기 때문에 디폴트로는 False이므로 명시적으로 이니블로 할 필요가 있습니다.

mysql 서버를 시작하지 않고 프로그램을 실행하려다 같은 오류가 발생했습니다.

mysql 서버를 시작한 후 모든 것이 정상적으로 진행되었습니다.

/etc/mysql/my.cnf 파일에서 IP 주소를 업데이트하십시오.

bind-address  = 0.0.0.0

mysql deamon 및 mysql 서비스를 재시작합니다.

MySQL-JDBC-Type-4-Treiber(예를 들어 'mysql-connector-java-5.1.11-bin.jar' from 'mysql-connector-java-5.1.11.zip')를 다운로드합니다.

클래스 패스에 컴파일 및 런타임 중에 드라이버 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" );

같은 문제는 다음 단계로 해결됩니다.

  1. ★★★★★★★★★★★★★★★로 이동my.cnf

    vi /etc/mysql/my.cnf
    
  2. 바인드 주소 변경

    "bind-address = 0.0.0.0"
    
  3. MySQL 재시작

    sudo /etc/init.d/mysql restart
    

「 」를 사용하고 WAMP ★★★★★★★★★★★★★★★★★」XAMP databaseserver to install mysql database. 다음 않으면 mysql server가 됩니다. 그렇지 않으면 표시됩니다.com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

나는 이 문제를 쉽게 풀었고, 그것은 나에게 효과가 있었다. seme 문제는 "com.dbc. exceptions.jdbc4"였다.jdbc4"였다.통신예외:통신 링크 장애"db.properties 파일에는 url:jdbc:mysql://localhost:90/myDB가 있고 포트 URL만 삭제되어 있습니다.이 결과, url:jdbc:mysql://localhost/myDB가 기능했습니다.

my.ini 및 php.ini 파일에서 mysql 포트를 3306에서 3307로 변경했는데 포트(3307->3306)를 변경한 후 다시 정상적으로 동작했습니다.

포트를 변경한 경우 다음과 같은 오류 "com.mysql.jdbc.exceptions.jdbc4"가 표시됩니다.통신예외:통신 링크 장애" 포트 번호를 확인하십시오.

하다localhost로로 합니다.127.0.0.1.

는 컬컬음음 음음음음음으로 됩니다.::1MySQL 6 IPv6 。

은 '입니다.telnet localhost 3306:

$ telnet localhost 3306
Trying ::1...

MySQL 서버에서 응답이 없습니다.

물론 MySQL 서버가 실행 중인지 확인하십시오.

dbhost=jdbc:mysql://172.18.23.100:3306/yourdatabase?useUnicode=yes&characterEncoding=UTF-8&useSSL=false
user=root
password=Password#321

con = DriverManager.getConnection(dbhost, user, password);

if mysql 버전8 이후 사용자 업데이트 커넥터

제 경우 mysql-connector-java 버전이 달랐습니다.mysql jdbc를 maria jbdc로 변경했습니다.

오래된 jdbc 드라이버

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.21</version>
</dependency>


새로운 Jdbc 드라이버

<!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
<dependency>
    <groupId>org.mariadb.jdbc</groupId>
    <artifactId>mariadb-java-client</artifactId>
    <version>2.6.2</version>
</dependency>

방금 이 일을 경험했다.

동작시키는 방법: (스태틱 블록 초기화기에 넣을 수 있습니다)

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

안부 전해요.

Mysql 리모트콜의 경우

  1. 예: IP=remote에서 Mysql에 원격 사용자 추가IP:

    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 = 0.0.0.0
    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'
    

원격 Jenkins 서버에서 자동화 테스트를 실행하는 동안 이 문제가 발생했습니다.그러나 로컬에서 테스트를 실행하는 동안에는 문제가 발생하지 않았습니다.

서버 측에서 MySQL 버전이 변경되었기 때문에 mysql-connector 버전을 POM 파일의 최신 버전으로 업데이트한 후 이 문제가 해결되었습니다.

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

그러나 같은 디버깅은 조금 어려웠고 MySQL 버전 변경에 대해 알지 못했고 로컬에서도 정상적으로 동작했기 때문에 거의 이틀이 걸렸습니다.

저도 같은 문제가 있었는데, 해결 방법은 다음과 같습니다.

  1. .jsp는 서블릿에서 아직 정의하지 않은 Atribut을 호출하고 있었습니다.
  2. 는 두 을 가지고 , 이 컬럼 이름을 통해서 에 전달하고 있었습니다.ResultSet (getString("columnName"))내 데이터베이스에 있는 열 이름과 일치하지 않습니다.

어느 쪽이 문제를 해결했는지 정확히 알 수는 없지만, 효과가 있었다. 새로운 「」, 「」를 작성해 .Statement ★★★★★★★★★★★★★★★★★」ResultSet각 테이블 쿼리에 대해 지정합니다.

오래된 것도 있습니다.mysql-connector-java-XXX-bin.jarmysql 사용하다mysql-connector-java-5.1.18-bin.jar내가 사용하고 있는 바와 같이mysql 5.5이 문제는 해결되었습니다.

Mysql 및 Apache 서버를 시작하지 않았을 수 있습니다.XAMPP Control Panel에서 Apache 서버와 Mysql을 실행한 후 연결이 정상적으로 확립되었습니다.

행운을 빕니다.

해결 방법은 두 가지입니다. 1. 다음 connads를 사용하여 root 이외의 새로운 사용자를 만듭니다.

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

2. mysqld.conf의 IP 주소 행에 코멘트합니다.

새 사용자 이름과 비밀번호로 연결합니다.그건 작동할 거야.

이전 버전의 MySQL('버전', '5.1.73')에 접속하려고 했습니다.새로운 버전의 드라이버를 사용하면 "com.mysql.cj.jdbc"를 사용해야 한다는 오류가 나타납니다.드라이버 또는 사용하는 드라이버는 특별히 지정할 필요가 없습니다.

로드 중com.mysql.jdbc.Driver'. This is deprecated. The new driver class iscom.mysql.cj.jdbc.com..jdbc에 접속해 주세요 를 통해 할 필요가 없습니다드라이버는 SPI를 통해 자동으로 등록되며 일반적으로 드라이버 클래스를 수동으로 로드할 필요가 없습니다.

선언문을 5.1.38 버전의 mysql-connector-java를 사용하도록 변경하고 com.mysql.jdbc를 코드로 유지했습니다.드라이버

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

Ankit Jain의 대답을 보고 모든 것이 시작되었다.

MySQL이 수신하고 있는 Post 3307을 방화벽이 차단하고 있었습니다.그래서 나는 3307에서 3306으로 항구를 바꿨어요.그러면 데이터베이스에 성공적으로 연결할 수 있습니다.

언급URL : https://stackoverflow.com/questions/2983248/com-mysql-jdbc-exceptions-jdbc4-communicationsexception-communications-link-fai

반응형