>  Q&A  >  본문

JDBC 및 MySQL을 통한 "통신 링크 실패" 해결

<p>我正在尝试连接到本地 MySQL 服务器,但不断收到错误消息。</p> <p>这是代码。</p> <pre class="brush:php;toolbar:false;">public class Connect { public static void main(String[] args) { Connection conn = null; try { String userName = "myUsername"; String password = "myPassword"; String url = "jdbc:mysql://localhost:3306/myDatabaseName"; Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, userName, password); System.out.println("Database connection established"); } catch (Exception e) { System.err.println("Cannot connect to database server"); System.err.println(e.getMessage()); e.printStackTrace(); } finally { if (conn != null) { try { conn.close(); System.out.println("Database Connection Terminated"); } catch (Exception e) {} } } } }</pre> <p>以及错误:</p> <pre class="brush:php;toolbar:false;">Cannot connect to database server 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. 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:411) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2333) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2370) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) 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:411) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305) at java.sql.DriverManager.getConnection(DriverManager.java:582) at java.sql.DriverManager.getConnection(DriverManager.java:185) at Connect.main(Connect.java:16) Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) 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:257) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294) ... 15 more</pre> <p>我已经设置了类路径,确保 my.cnf 已注释掉跳过网络选项。 </p> <p>java版本是1.2.0_26(64位) mysql 5.5.14 mysql连接器5.1.17</p> <p>我确保用户有权访问我的数据库。</p>
P粉038161873P粉038161873422일 전433

모든 응답(1)나는 대답할 것이다

  • P粉068486220

    P粉0684862202023-08-25 09:47:17

    저도 두 프로그램에서 같은 문제를 겪었습니다. 내 오류는 다음과 같습니다:

    으아악

    이 문제를 해결하는 데 며칠이 걸렸습니다. 여러 웹사이트에 언급된 여러 가지 방법을 테스트했지만 그 중 아무 것도 작동하지 않았습니다. 마침내 코드를 변경하고 문제를 알아냈습니다. 다양한 방법을 소개하고 여기에 요약해 보겠습니다.

    인터넷에서 이 오류에 대한 해결책을 찾다가 적어도 한 사람에게는 효과가 있는 많은 해결책이 있었지만 다른 사람들은 자신에게 효과가 없다고 말했습니다!

    강> 이 오류를 해결하는 방법은 왜 여러 가지인가요? 보통 이 오류는 서버 연결에 문제가 있을 때 발생하는 것 같습니다. 아마도 문제는 잘못된 쿼리 문자열이나 데이터베이스에 대한 연결이 너무 많기 때문일 수 있습니다.

    그러니 모든 해결 방법을 하나씩 시도해보고 포기하지 마세요!

    다음은 제가 인터넷에서 찾은 솔루션입니다. 각 솔루션에 대해 최소한 한 사람의 문제가 해당 솔루션으로 해결되었습니다.

    팁: MySQL 설정 변경이 필요한 솔루션의 경우 다음 문서를 참조하세요.

    • Linux: /etc/mysql/my.cnf/etc/my.cnf (Linux 배포판과 사용된 MySQL 패키지에 따라 다름)

    • Windows: C:**ProgramData**MySQLMySQL Server 5.6my.ini(프로그램 파일이 아니라 ProgramData라는 점에 유의하세요)

    해결책은 다음과 같습니다.

    • 변경 bind-address속성:

      bind-address 속성의 주석 처리를 해제하거나 다음 IP 중 하나로 변경하세요.

      으아악

      또는

      으아악
    • “네트워킹 건너뛰기”를 주석 처리하세요

      MySQL 구성 파일에 skip-networking 行,请在该行的开头添加 # 기호가 있으면 주석 처리하세요.

    • "wait_timeout" 및 "interactive_timeout" 변경

      MySQL 구성 파일에 다음 줄을 추가하세요:

      으아악
    • Java가 "localhost"를 [127.0.0.1] 대신 [:::1]로 번역하지 않는지 확인하세요

      MySQL은 인식할 수 있기 때문에 127.0.0.1 (IPv4),但不能识别 :::1 (IPv6)< /p>

      다음 두 가지 방법 중 하나를 사용하면 이 문제를 피할 수 있습니다.

      1. 연결 문자열에 127.0.0.1 而不是 localhost 以避免 localhost 被转换为 ::: 1

        사용
      2. 옵션 -Djava.net.preferIPv4Stack=true运行java以强制java使用IPv4而不是IPv6。在 Linux 上,这也可以通过运行(或将其放入 /etc/profile을 사용하여 다음을 달성하세요.

        으아악
    • 운영 체제 프록시 설정, 방화벽 및 바이러스 백신 프로그램 확인

      MySQL 서비스가 방화벽이나 바이러스 백신 소프트웨어에 의해 차단되지 않았는지 확인하세요.

      Linux에서 iptables를 일시적으로 중지합니다. iptables가 잘못 구성된 경우 tcp 패킷이 mysql 포트로 전송되는 것을 허용하지만 tcp 패킷이 동일한 연결로 반환되는 것을 방지할 수 있습니다.

      으아악

      Windows에서 바이러스 백신 소프트웨어를 중지하세요.

    • 연결 문자열 변경

      쿼리 문자열을 확인하세요. 연결 문자열은 다음과 같아야 합니다.

      으아악

    문자열에 공백이 없는지 확인하세요. 모든 연결 문자열은 공백 문자 없이 연속되어야 합니다.

    "localhost"를 루프백 주소 127.0.0.1로 바꿔보세요. 또한 다음과 같이 연결 문자열에 포트 번호를 추가해 보세요.

    으아악

    일반적으로 MySQL의 기본 포트는 3306입니다.

    사용자 이름과 비밀번호를 MySQL 서버의 사용자 이름과 비밀번호로 변경하는 것을 잊지 마세요.

    • JDK 드라이버 라이브러리 파일 업데이트
    • 다양한 JDK 및 JRE 테스트(예: JDK 6 및 7)
    • max_allowed_packet
    • 을 변경하지 마세요.

    "max_allowed_packet"은 최대 패킷 수가 아닌 최대 패킷 크기를 나타내는 MySQL 구성 파일의 변수입니다. 따라서 이는 이 오류를 해결하는 데 도움이 되지 않습니다.

    • Tomcat 보안 변경

    TOMCAT6_SECURITY=yes를 TOMCAT6_SECURITY=no로 변경하세요

    • validationQuery 속성 사용

    모든 쿼리에 대한 응답을 보장하려면 유효성 검사="select now()"를 사용하세요

    • 자동 재연결

    연결 문자열에 다음 코드를 추가하세요:

    으아악

    이러한 솔루션 중 어느 것도 나에게 도움이 되지 않았지만 시도해 보는 것이 좋습니다. 어떤 사람들은 이러한 단계를 수행하여 문제를 해결했기 때문입니다.

    그런데 내 문제는 어떻게 해결되었나요?

    내 문제는 데이터베이스에 SELECT가 너무 많다는 것입니다. 연결을 만든 다음 닫을 때마다. 매번 연결을 닫아도 시스템에 많은 연결이 발생하여 이 오류가 발생합니다. 내가 한 일은 연결 변수를 전체 클래스에 대한 공개(또는 비공개) 변수로 정의하고 생성자에서 초기화하는 것이었습니다. 그러면 그 연결을 사용할 때마다. 그것은 내 문제를 해결하고 속도를 엄청나게 향상시켰습니다.

    #결론# 이 문제를 해결하는 간단하고 독특한 방법은 없습니다. 자신의 상황에 따라 위의 해결 방법을 고려하는 것이 좋습니다. 프로그램 시작 시 이 오류가 발생하고 데이터베이스에 전혀 연결할 수 없는 경우 연결 문자열에 문제가 있을 수 있습니다. 그러나 데이터베이스와 성공적으로 상호 작용한 후 이 오류가 발생하면 연결 수에 문제가 있을 수 있으므로 "wait_timeout" 및 기타 MySQL 설정을 변경하거나 코드를 다시 작성하여 연결 수를 줄이는 것이 좋습니다.

    회신하다
    0
  • 취소회신하다