bestsource

com.vmdk.jdbc.exceptions.jdbc4.커뮤니케이션예외:통신 링크 고장

bestsource 2023. 8. 17. 21:34
반응형

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.

이 경우에도 해당될 경우 가능한 모든 원인은 다음과 같습니다.

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

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

  1. 다을사여검증으로 확인하고 합니다.ping.
  2. 대신 DNS를 새로 고치거나 JDBC URL의 IP 주소를 사용합니다.
  3. 다을기로확인을 기준으로 합니다.my.cnfMySQL DB에 있습니다.
  4. 시작.
  5. 없이 시작되는지 합니다.--skip-networking선택.
  6. 방화벽을 사용하지 않도록 설정하거나 포트를 허용/전송하도록 방화벽/프록시를 구성합니다.

참고로 (실제 문제와 무관하게) 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, hibernateC3P0 설정에서는 예외입니다.

  1. Tomcat을 사용하는 경우 보안 예외를 확인하십시오(다시 한 번 SO에 있습니다, 찾을 수 있을 것입니다).
  2. 사용 중인 URL을 확인할 수 있는지 확인합니다.
  3. c3p0을 추가해 보십시오.
  4. 연결을 거부하는 방화벽이 없는지 확인
  5. 마지막으로, GNU/리눅스(예: ARCH 리눅스)를 사용하고 있고 실제로 이 예외를 얻게 된다면 MySQL 포럼 :: JDBCJava :: EOF 예외: 서버에서 응답을 읽을 수 없습니다. 연결이 예기치 않게 손실되기 전에 4바이트를 읽고 0바이트를 읽어야 합니다.

링크가 제거되면 mysqld를 추가합니다.모두 /etc/hosts로 이동합니다.허락하다

는 그것이 약간 확장된다는 것을 알지만, 그것은 GNU/리눅스를 사용하고 이 예외를 가진 사람이라면 누구나 도울 수 있을 것이고, 이 스레드는 내 연구를 게시하기에 가장 좋은 장소로 보였습니다.

도움이 되길 바랍니다.

저도 같은 오류가 발생했는데, 그때 Mysql 서버가 작동하지 않아서 확인했습니다.

서버의 상태를 변경하려면



  1. 서버: 를 검색합니다.
  2. 상태 열되지 않는다고 을 볼 수 .
  3. 마우스 오른쪽 버튼을 클릭하고 시작을 선택합니다.

이것이 도움이 되기를 바랍니다.

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.1my.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

반응형