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를 사용합니다.여기에는 다음 중 하나의 원인이 있을 수 있습니다.
- JDBC URL의 IP 주소 또는 호스트 이름이 잘못되었습니다.
- JDBC URL의 호스트 이름이 로컬 DNS 서버에서 인식되지 않습니다.
- JDBC URL에 포트 번호가 없거나 잘못되었습니다.
- DB 서버가 다운되었습니다.
- DB 서버가 TCP/IP 연결을 허용하지 않습니다.
- DB 서버의 연결이 부족합니다.
- Java와 DB 사이의 무언가가 연결을 차단하고 있습니다(예: 방화벽 또는 프록시).
어느쪽인가를 해결하려면 , 다음의 어드바이스를 따릅니다.
- 「 」로 및 합니다.
ping.- 대신 DNS를 새로 고치거나 JDBC URL의 IP 주소를 사용하십시오.
- 합니다.
my.cnfMySQL DB 。- DB를 시작합니다.
- 가 mysqld 없이 합니다.
--skip-networking option.- 하고 DB에서 을 닫도록 합니다.
finally.- 방화벽을 비활성화하거나 포트를 허용/전송하도록 방화벽/프록시를 설정합니다.
다음 항목도 참조하십시오.
- 서블릿 기반 응용 프로그램에서 JDBC 데이터베이스/데이터소스에 연결하려면 어떻게 해야 합니까?
- static java.sql을 사용해도 안전합니까?멀티스레드 시스템의 접속 인스턴스?
제 경우 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" );
같은 문제는 다음 단계로 해결됩니다.
★★★★★★★★★★★★★★★로 이동
my.cnfvi /etc/mysql/my.cnf바인드 주소 변경
"bind-address = 0.0.0.0"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 리모트콜의 경우
예: 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 affectedMysql에 대한 원격접속을 허용합니다(기본적으로 모든 외부 콜은 허용되지 않습니다).
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최신 버전의 JDBC 드라이버의 경우 JDBC:
jdbc.url='jdbc:mysql://remoteIP:3306/yourDbInstance?autoReconnect=true&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&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 버전 변경에 대해 알지 못했고 로컬에서도 정상적으로 동작했기 때문에 거의 이틀이 걸렸습니다.
저도 같은 문제가 있었는데, 해결 방법은 다음과 같습니다.
- .jsp는 서블릿에서 아직 정의하지 않은 Atribut을 호출하고 있었습니다.
- 는 두 을 가지고 , 이 컬럼 이름을 통해서 에 전달하고 있었습니다.
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
'programing' 카테고리의 다른 글
| Vue.js를 사용하여 CSS 클래스 속성 변경 (0) | 2022.07.30 |
|---|---|
| 데이터 변경 시 vue 프로토타입이 반응하지 않음 (0) | 2022.07.30 |
| Vue 3에 Vuex 스토어를 삽입하는 방법 (0) | 2022.07.28 |
| Maven을 통한 Java 7 코드 컴파일 (0) | 2022.07.28 |
| 처음 방문할 때까지 v-tab 내의 구성 요소에서 Vuex 상태를 볼 수 없음 (0) | 2022.07.28 |