com.vmdk.jdbc.exceptions.jdbc4.커뮤니케이션예외:통신 링크 고장
MySQL 데이터베이스에 연결하는 프로그램은 정상적으로 작동했습니다.그런 다음 연결을 설정하는 데 사용되는 코드를 변경하지 않고 다음 예외가 발생합니다.
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.
무슨 일입니까?
연결을 가져오는 데 사용되는 코드:
private static Connection getDBConnection() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
String username = "user";
String password = "pass";
String url = "jdbc:mysql://www.domain.com:3306/dbName?connectTimeout=3000";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
이것은 포장된 예외이며 별로 흥미롭지 않습니다.그것은 우리에게 근본 원인에 대해 실제로 무언가를 알려주는 예외의 근본 원인입니다.스택 트레이스에서 조금 더 자세히 살펴보세요.당신이 직면할 가능성은 큽니다.SQLException: Connection refused
또는SQLException: Connection timed out
.
이 경우에도 해당될 경우 가능한 모든 원인은 다음과 같습니다.
- JDBC URL의 IP 주소 또는 호스트 이름이 잘못되었습니다.
- JDBC URL의 호스트 이름이 로컬 DNS 서버에서 인식되지 않습니다.
- JDBC URL에 포트 번호가 없거나 잘못되었습니다.
- DB 서버가 다운되었습니다.
- DB 서버가 TCP/IP 연결을 허용하지 않습니다.
- Java와 DB 사이의 무언가가 연결을 차단하고 있습니다(예: 방화벽 또는 프록시).
하나 또는 둘 중 하나를 해결하려면 다음 조언을 따르십시오.
- 다을사여검증으로 확인하고 합니다.
ping
. - 대신 DNS를 새로 고치거나 JDBC URL의 IP 주소를 사용합니다.
- 다을기로확인을 기준으로 합니다.
my.cnf
MySQL DB에 있습니다. - 시작.
- 없이 시작되는지 합니다.
--skip-networking
선택. - 방화벽을 사용하지 않도록 설정하거나 포트를 허용/전송하도록 방화벽/프록시를 구성합니다.
참고로 (실제 문제와 무관하게) JDBC 드라이버를 다음과 같이 로드할 필요는 없습니다. getConnection()
호출. 시작하는 동안 한 번만 실행하면 됩니다.
DB 서버에 설정된 대기 시간 제한을 확인합니다.기본값이 10초인 경우도 있습니다.그러면 10초 후에 연결이 끊어집니다.
mysql> show global variables like '%time%' ;
업데이트를 해서 28800 정도로 만듭니다.
mysql> SET GLOBAL wait_timeout = 28800;
저도 약 8-9일 동안 이 문제를 겪고 있습니다.다음은 몇 가지 배경입니다.저는 bash에서 실행되는 간단한 자바 애플리케이션을 개발하고 있습니다.
세부사항:
- 스프링 2.5.6
- Hibernate3.2.3.ga
- 메이븐과 함께. (프로젝트의 기반은 주석이 없는 봄 튜토리얼인 mkyong.com 에서 제공됩니다.)
- MySQL 버전:
[jvazquez@archbox ~]$ mysql --versionmysql Ver 14.14 리눅스용 5.5.9 배포(i686), 읽기 줄 5.1 사용 리눅스 아치박스 2.6.37-ARCH #1 SMP PREMENT 2월 18일 금요일 16:58:42 UTC 2011 i686 인텔(R) 코어(TM)2 쿼드 CPU Q8200 @ 2.33GHz 정품인텔 GNU/리눅스
이 애플리케이션은 Arch Linux, Mac OS X 10.6 및 FreeBSD 7.2에서 잘 작동합니다.동일한 mysql, 유사한 my.cnf 및 유사한 커널 버전을 사용하여 jar 파일을 다른 호스트의 다른 arch Linux로 이동했을 때 연결이 중단되어 원래 포스터와 동일한 오류가 발생했습니다.
com.vmdk.jdbc.exceptions.jdbc4.커뮤니케이션예외:통신 링크 고장
저는 제가 찾은 이것과 포럼(예: http://forums.mysql.com/read.php?39,180347,180347#msg-180347 은 지금 닫혀서 게시할 수 없습니다...), 특히 다음과 같은 모든 것을 시도했습니다.
- 스킵 네트워킹을 사용하지 않았는지 세 번 확인합니다.(psaux 및 my.cnf와 함께 제공)
- my.cnf에서 log_message=1을 활성화하려고 했지만 분명히 서버를 치지 않았기 때문에 앱을 사용하는 동안 아무것도 보지 못했습니다.
- SHOWENGINE innodb STATUS는 전혀 표시되지 않았습니다. 테스트 중에 셸을 통해 연결할 수 있었고, php도 mysql 서버에 연결할 수 있었습니다.
- /etc/hostname에는 localhost 127.0.0.1이 있습니다.
- localhost 및 127.0.0.1을 사용하여 jdbc 속성을 시도했지만 결과가 없습니다.
- c3p0 추가를 시도하고 max_wait를 변경했습니다.
- my.cnf의 최대 연결 수가 900, 2000으로 변경되었지만 my.cnf는 여전히 없습니다.
- wait_message = 60 my.cnf 추가
- net_wait_message = 360 my.cnf 추가
- destroy-message="close" spring.xml 추가
지적했듯이 (같은 예외를 찾아보면 com.myql.jdbc.exceptions.jdbc4 문제에 대한 몇 가지 so 스레드를 찾을 수 있습니다.커뮤니케이션예를 들어 Spring, hibernate 및 C3P0 설정에서는 예외입니다.
- Tomcat을 사용하는 경우 보안 예외를 확인하십시오(다시 한 번 SO에 있습니다, 찾을 수 있을 것입니다).
- 사용 중인 URL을 확인할 수 있는지 확인합니다.
- c3p0을 추가해 보십시오.
- 연결을 거부하는 방화벽이 없는지 확인
- 마지막으로, GNU/리눅스(예: ARCH 리눅스)를 사용하고 있고 실제로 이 예외를 얻게 된다면 MySQL 포럼 :: JDBC 및 Java :: EOF 예외: 서버에서 응답을 읽을 수 없습니다. 연결이 예기치 않게 손실되기 전에 4바이트를 읽고 0바이트를 읽어야 합니다.
링크가 제거되면 mysqld를 추가합니다.모두 /etc/hosts로 이동합니다.허락하다
나는 그것이 약간 확장된다는 것을 알지만, 그것은 GNU/리눅스를 사용하고 이 예외를 가진 사람이라면 누구나 도울 수 있을 것이고, 이 스레드는 내 연구를 게시하기에 가장 좋은 장소로 보였습니다.
도움이 되길 바랍니다.
저도 같은 오류가 발생했는데, 그때 Mysql 서버가 작동하지 않아서 확인했습니다.
서버의 상태를 변경하려면
-
- 로
- 서버: 를 검색합니다.
- 상태 열되지 않는다고 을 볼 수 .
- 마우스 오른쪽 버튼을 클릭하고 시작을 선택합니다.
이것이 도움이 되기를 바랍니다.
Apache Commons 연결 풀링을 사용하는 소프트웨어(Tomcat이 포함된 웹 앱)가 있으며 수년간 잘 작동했습니다.지난 달에는 오래된 버그가 발생하여 라이브러리를 업데이트해야 했습니다.이 버그는 최신 버전에서 수정되었습니다.
이 시스템을 구축한 후 얼마 지나지 않아 이러한 메시지가 정확히 전달되기 시작했습니다.하루에 연결되는 수천 개의 연결 중 소수(보통 10개 미만)만 이 오류 메시지를 받습니다.실제 패턴은 없었습니다. 가끔 2~5개의 작은 그룹으로 군집하는 것을 제외하고는 말이죠.
풀에서 연결을 가져오거나 풀에 다시 넣을 때마다 연결의 유효성을 확인하기 위해 옵션을 풀에서 로 변경하여 문제가 해결되었습니다.
최근에 MySQL 병을 업데이트했습니까?우리의 (인정하건대 아주 오래된) 병에 없던 새로운 설정이 있을 수도 있는 것 같습니다.
저는 BalusC의 의견에 동의합니다. 예를 들어 MySQL에 전달하는 옵션(연결 제한 시간 외)과 같은 다른 옵션을 사용해 보십시오.
이 오류가 영구적인 오류가 아닌 일시적인 오류인 경우에는 작업이 성공할 때까지 시도하거나 연결 풀을 사용하여 세부 사항을 처리할 수 있습니다.
기타 무작위 아이디어:왜 폐쇄 연결을 사용하려고 하는지 모르겠습니다(어떤 예외가 발생하는지).어딘가에서 실수로 연결을 끊으실 수 있습니까?
건너뛰기 네트워킹이 my.cnf/my.ini에서 주석 처리되었는지 확인합니다.
Balus C가 언급했듯이, 전체 스택 추적을 게시하는 것은 매우 유용할 것입니다(항상 전체 스택 추적을 게시합니다, 스택 추적의 첫 번째 줄만 갖는 것은 쓸모없고 좌절스럽습니다).
어쨌든, 당신의 코드가 정상적으로 작동하고 있고 코드 변경 없이 이 문제가 갑자기 발생하기 시작했다고 말씀하셨는데, 이것이 디버깅 중에 DB 연결을 닫지 않는 문제와 관련이 있는지 궁금합니다.사실 디버깅 중에 이 문제가 시작되었다면 (연결이 다 된 것 같습니다.)이 경우 데이터베이스 서버를 재시작하고 다른 질문의 제안에 따라 이 상황을 방지합니다.
같은 문제가 발생했습니다.spring & dbcp & mysql 5.5를 사용하고 있습니다.하지만 내가 변한다면,localhost
로.192.168.1.110
그러면 모든 것이 작동합니다.상황을 더 이상하게 만드는 것은.mysql -h localhost
그냥 잘 작동합니다.
update: 드디어 해결책을 찾았습니다.바인딩 주소를 다음으로 변경localhost
또는127.0.0.1
에my.conf
문제를 해결할 것입니다.
제 경우, 로컬 루프백 인터페이스가 시작되지 않아 "localhost"를 확인할 수 없습니다."ifconfig"를 실행하여 이를 확인할 수 있으며 "lo"라는 인터페이스가 표시됩니다.작동하지 않는 경우 "ifuplo" 또는 "ifconfig lo up"을 실행하여 활성화할 수 있습니다.
제 경우, mysql.com 에서 다운로드한 Connector/J 5.1.29.jar에 이 오류가 있는 반면 MvnRepository에서 다운로드한 5.1.29.jar에는 이 오류가 없습니다.
Android Studio(Gradle, Windows x64)에서 Google 앱 엔진 애플리케이션을 구축하고 로컬 네트워크/로컬 VM의 Linux MySQL 서버와 통신할 때 이 문제가 발생했습니다.
원격 호스트에 연결하고 있습니다.이제 문제는 인터넷에 연결하기 위해 어떤 유형의 네트워크를 사용하고 있느냐는 것입니다.
창문들
모바일 광대역 장치인 경우 컴퓨터의 IP 주소를 가져와 호스트 서버가 컴퓨터의 연결을 허용할 수 있도록 호스트 서버에 추가합니다.[보안상의 이유로 호스트가 이 기능을 해제했을 수 있습니다.]다른 네트워크 장치를 사용할 때마다 IP가 변경됩니다.
LAN을 사용하는 경우 시스템에 정적 IP 주소를 설정한 다음 호스트에 추가합니다.
이것이 도움이 되길 바랍니다!! :)
java.sql을 사용할 때 통신 장애 오류가 발생했습니다.구체적인 설명문이 포함된 준비된 설명문입니다.
이는 Windows 7 x64 시스템에서 MySQL 5.6, Tomcat 7.0.29 및 JDK 1.7.0_67에 대해 실행되었습니다.
원인은 문자열 매개 변수에 정수를 설정하고 정수 매개 변수에 문자열을 설정한 다음 실행을 수행하려고 시도한 것으로 밝혀졌습니다.준비된 문에 대해 쿼리합니다.파라미터 설정 순서를 수정한 후 문이 올바르게 수행되었습니다.
이는 오류 메시지의 문구가 제시한 것처럼 네트워크 문제와는 아무런 관련이 없습니다.
근본적인 문제는 Mysql JDBC 풀 연결이 사용되지 않는다는 것입니다. 그런 다음 Mysql에서 시간 초과를 선택하고 연결을 닫습니다.연결에 오류가 발생할 경우 다시 시작하려면 다음과 같은 방법으로 매개 변수 풀을 변경해야 합니다.
Connection Validation
항목(체크)
Validation Method:
커밋
작동할 수 없는 경우 유효성 검사 방법을 변경할 수 있습니다!
WAMP를 사용하는 경우 WAMP가 온라인 상태인지 확인합니다.제가 한 일은, 처음에는 방화벽을 해제하고, 그 다음에는 작동했습니다. 그래서 그 후에는 모든 로컬 포트, 특히 포트 80에 대한 연결을 허용했습니다.제가 이 문제를 없앴기 때문입니다.저는 방화벽이 연결을 차단하고 있었습니다.
저도 같은 문제가 있었고 대부분의 매개 변수(자동 연결 등)를 사용했지만 (test_on_idle 또는 test_on_connect)는 시도하지 않았습니다. 다음에 할 예정입니다.
하지만, 저는 이것을 극복하게 해준 해킹이 있었습니다.
저는 Healthcheck라는 cron 작업을 하고 있는데, 10분마다 일어나서 서버에 REST API 호출을 합니다.웹/앱 서버는 이 메시지를 받아 DB에 연결하고, 약간의 변경을 가한 후 '서부 전선에서 모두 조용합니다' 또는 '엉뚱한 일이 발생합니다'라는 메시지를 표시합니다.후자의 경우, 적절한 사람들에게 호출기/이메일을 보냅니다.
DB 연결 풀을 항상 새로 유지하는 부작용이 있습니다.이 크론이 실행되는 한, 나는 db 연결 시간 제한 문제가 없습니다.그렇지 않으면, 그들은 불쑥 나타납니다.
언급URL : https://stackoverflow.com/questions/2121829/com-mysql-jdbc-exceptions-jdbc4-communicationsexceptioncommunications-link-fail
'bestsource' 카테고리의 다른 글
한 테이블에 행을 삽입하고 다른 테이블의 값을 Maria와 함께 루프에 삽입DB (0) | 2023.08.22 |
---|---|
데이터 전용 볼륨을 한 호스트에서 다른 호스트로 포팅하는 방법은 무엇입니까? (0) | 2023.08.17 |
파워셸에서 처분하지 않는 것은 얼마나 나쁜 일입니까? (0) | 2023.08.17 |
Git 소스 제어 하에서 지속적으로 변화하는 IntelliJ IDEA 프로젝트 파일을 처리하는 방법은 무엇입니까? (0) | 2023.08.17 |
노드 재동기화 후 Galera 클러스터 성능 저하 (0) | 2023.08.17 |