Tomcat 또는 외부를 통해 JDBC 커넥터를 통해 mysql에 연결할 수 없습니다


17

스톡 mysql 5.5 설치를 설치했으며 mysql 명령을 통해 mysql 서비스에 연결할 수 있지만 서비스가 실행중인 것 같지만 spring + tomcat 또는 외부 jdbc 커넥터를 통해 연결할 수 없습니다.

다음 URL을 사용하고 있습니다.

jdbc:mysql://myserver.com:myport/mydb

올바른 사용자 이름 / 암호를 사용하지만 다음 메시지가 표시됩니다.

server.com: 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.
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

외부 연결을 시도하는 것과 같은 문제 인 것 같습니다.


Java를 통해 LAN의 다른 서버에서 실행되는 mysql 데이터베이스에 연결하려고 할 때이 문제에 직면했습니다. mysql을 실행하는 서버에서 동일한 Java 프로그램을 실행할 때 문제없이 연결되었습니다. 외부 컴퓨터에서 SQLYog를 사용하여 mysql 데이터베이스에 연결할 수 있습니다 (12. 12.0.1 대신 0.0.0.0에 바인딩하도록 my.cnf 파일을 변경해야했지만). Boden의 답변과 JDBC 커넥터 변경에 대한 의견은 올바른 방향을 제시했습니다. JDBC 커넥터를 최신 버전으로 변경하고 갑자기 작동했습니다!
user2380870

답변:


18

이것은 여러 가지 이유로 발생할 수 있습니다. 방금 몇 주 전에 직접 보았지만 해결 방법이 무엇인지 기억할 수 없습니다.

1) mysql이 바인딩 된 주소를 확인하십시오. 최소한 표준 우분투 서버에서는 127.0.0.1 (기본값)이라고 생각합니다. 사용 가능한 모든 주소에 바인딩하려면 my.cnf에서 bind-address 매개 변수를 주석 처리해야합니다 (여러 개를 선택할 수 없으며 하나 또는 전부 임).

2) 127.0.0.1에 바인딩되어 있고 "localhost"를 사용하여 연결할 수없는 경우 IPv4 대신 IPv6 로컬 호스트 주소로 해석되지 않는지 확인하십시오. (또는 그냥 IP 주소를 사용하십시오)

3) mysql이 수신하는 포트를 두 번 확인하십시오.

4) JDK에 올바른 JDBC 커넥터를 사용하고 있는지 확인하십시오.

5) --skip-networking으로 mysql을 시작하는 것과 같이 실제로 바보 같은 일을하지 않아야합니다.

내 첫 번째 제안이 가장 큰 약속이라고 생각합니다 ... 사실 내가 최근에 본 곳이라고 생각합니다 ... 나는 mysql에 원격으로 연결하려고했습니다 (우분투 8.04에서도).


내 2 센트를 추가하기 위해 4 번째가 나를 위해 일했습니다. 감사!
Janis Peisenieks

1
"사용 가능한 모든 주소에 바인딩하려면 my.cnf의 bind-address 매개 변수를 주석 처리해야합니다"와 관련하여 기본값은 이제 localhost에서만 수신하므로 "bind-address = 0.0 줄을 사용해야합니다. [mysqld] 내의 0.0 "
Palo

13

두 프로그램에서 같은 문제가 발생했습니다. 내 오류는 이것이었다 :

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.

이 문제를 해결하기 위해 며칠을 보냈습니다. 다른 웹 사이트에서 언급 된 많은 접근 방식을 테스트했지만 그중 하나는 작동하지 않았습니다. 마지막으로 코드를 변경하고 문제가 무엇인지 알았습니다. 다양한 접근 방식에 대해 이야기하고 요약 해 드리겠습니다 .

이 오류에 대한 해결책을 찾기 위해 인터넷을 찾고 있었지만 적어도 한 사람에게는 효과가있는 솔루션이 많이 있지만 다른 사람들에게는 효과가 없다고 말합니다. 이 오류에 대한 접근 방식이 많은 이유는 무엇입니까? 보이는 이 오류가 발생할 수 있습니다 일반적으로 서버에 연결에 문제가있을 때 . 쿼리 문자열이 잘못되었거나 데이터베이스에 너무 많은 연결이 문제 일 수 있습니다.

따라서 모든 솔루션을 하나씩 시도하고 포기하지 않는 것이 좋습니다.

여기 인터넷에서 찾은 솔루션이 있으며 각 솔루션에 대해 적어도 그 문제로 해결 된 사람이 있습니다.

포인트 : MySQL 설정을 변경해야하는 솔루션에 대해서는 다음을 참조하지 않아도됩니다.

  • 리눅스 : /etc/my.cnf

  • Windows : D : \ Program Files \ mysql \ bin \ my.ini

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

  • "바인드 주소"속성 변경

"바인드 주소"속성을 주석 해제하거나 다음 Ips 중 하나로 변경하십시오.

bind-address = "127.0.0.1"

또는

bind-address = "0.0.0.0"

  • "건너 뛰기 네트워킹"

MySQL 설정 파일에 "skip-networking"줄이 있다면, 그 줄의 시작 부분에 "#"기호를 추가하여 주석을 만드십시오.

  • "wait_timeout"및 "interactive_timeout"변경

다음 줄을 MySQL 설정 파일에 추가하십시오 :

wait_timeout = 숫자

interactive_timeout = 숫자

connect_timeout = 숫자

  • 운영 체제 프록시 설정 확인

방화벽 또는 안티 바이러스 소프트웨어가 MySQL 서비스를 차단하지 않도록하십시오.

  • 연결 문자열 변경

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

dbName = "my_database";
dbUserName = "root";
dbPassword = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";

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

"localhost"를 127.0.0.1과 같은 포트로 바꾸십시오. 또한 다음과 같이 포트 번호를 연결 문자열에 추가하십시오.

String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";

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

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

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

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

  • 바람둥이 보안 변경

TOMCAT6_SECURITY = yes를 TOMCAT6_SECURITY = no로 변경

  • validationQuery 속성 사용

validationQuery = "select now ()"를 사용하여 각 쿼리에 응답이 있는지 확인하십시오.

  • 자동 재 연결

이 코드를 연결 문자열에 추가하십시오.

&autoReconnect=true&failOverReadOnly=false&maxReconnects=10

이러한 솔루션 중 어느 것도 나를 위해 효과가 없었지만 시도해 볼 것을 제안합니다. 이 단계를 수행하여 문제를 해결 한 사람들이 있기 때문에.

그러나 내 문제가 어떻게 해결 되었습니까? 내 문제는 데이터베이스에 많은 SELECT가 있다는 것입니다. 매번 연결을 만들고 닫았습니다. 매번 연결을 닫았지만 시스템에 많은 연결이 발생하여 오류가 발생했습니다. 내가 한 것은 연결 변수를 전체 클래스의 공용 (또는 개인) 변수로 정의하고 생성자에서 초기화하는 것입니다. 그런 다음 방금 해당 연결을 사용했습니다. 내 문제를 해결하고 속도가 크게 향상되었습니다.

결론

이 문제를 해결할 수있는 간단하고 독특한 방법은 없습니다. 자신의 상황에 대해 생각하고 위의 솔루션을 선택하는 것이 좋습니다. 프로그램 시작시이 오류가 발생하고 데이터베이스에 전혀 연결할 수 없으면 연결 문자열에 문제가있을 수 있습니다. 그러나 데이터베이스와의 몇 가지 성공적인 상호 작용 후이 오류가 발생하면 연결 수에 문제가있을 수 있으며 "wait_timeout"및 기타 MySQL 설정을 변경하거나 연결 수를 줄이는 방법을 코드에 다시 작성하십시오.


나도이 문제가 발생했습니다! 그러나 처음에는 my306을 3306 대신 8888 포트를 수신하도록 변경했습니다. 그래서 @sohail의 답변이 도움이되었습니다. 감사합니다

이것은 나를 위해 문제를 해결했습니다! Vagrant Homestead 설정으로 인해 어떤 이유로 localhost 대신 VM (10.0.2.15)에 주어진 주소에 바인딩되었습니다.
착륙선

1

Linux 설치를 실행중인 경우 SSH를 통한 수신 통신을 차단하는 lokkit이있을 수 있습니다.

루트로 로그인하고 프롬프트에서 lokkit 명령을 실행하고 방화벽과 SElinux를 비활성화 한 다음 동일한 문제가 있는지 확인하십시오.

또한 모든 권한이 올바른 위치에 쓸 수 있도록 권한이 올바르게 설정되어 있는지 확인하십시오.


우분투 8.04를 실행 중입니다. 나는 아마 그것을 언급했을 것입니다. 해당 배포판에 대한 특정 지침이 있습니까? 잠시 후 구글에 접속할 것이지만, 먼저 물어볼 것이라고 생각했습니다.
Stefan Kendall

sudo는 UFW 비활성화 우분투 방화벽 해제합니다
스티븐 톰슨

ufw를 설치하고 포트를 활성화하려고 시도했지만 주사위가 없습니다.
Stefan Kendall

ufw 및 iptables는 이미 제거되었습니다. ufw는 별도로 설치해야하는 관리 도구라고 생각했습니다. "iptables"는 그런 명령을 내리지 않으며 iptables 서비스가 실행되고 있지 않은 것 같습니다.
Stefan Kendall

마지막으로 자주 찾은 것은 mysql이 eth0 인터페이스와 로컬 호스트 인터페이스에서만 수신하도록 설정하는 것입니다. 다음을 시도하십시오. 작동하는 경우 jdbc : mysql : //myserver.com : myport / mydb를 jdbc : mysql : // localhost : myport / mydb로 변경하십시오. 다음 dev.mysql.com/doc/refman/5.1/en/
Stephen Thompson


1

잘못된 프록시 설정 으로 인해 발생할 수도 있습니다 . 이 문제는 jdbc를 통해 Mac의 Parallels 가상 어플라이언스에서 실행되는 MySQL 인스턴스에 연결하려고했습니다. jdbc 연결은 시스템 수준의 네트워크 설정을 사용하며 SOCKS 프록시 뒤에 있기 때문에 MySql 호스트를 비 프록시 호스트로 설정 해야했습니다 (예 : Mac의 경우 설정-> 네트워크-> 고급- > 프록시로 마지막으로 "이 호스트 및 도메인에 대한 프록시 설정 무시"에 호스트 이름 또는 IP 주소를 추가하십시오.


1

MySQL Connector / J는 TCP / IP 만 지원합니다. Java는 Unix 도메인 소켓 연결을 지원하지 않습니다.

MYSQL이 skip-networking 플래그로 시작되거나 MySQL이 방화벽 뒤에서 실행중인 경우 TCP / IP 옵션이 비활성화됩니다. Java가 MySQL과 통신 할 수 없도록합니다.


0

나는 거의 하루 동안 매우 비슷한 문제가 있었고, 나를 미치게했습니다! 그러나 해결책을 찾았습니다. 매우 간단했습니다 .TOMCAT6_SECURITY = yes를 TOMCAT6_SECURITY = no로 변경하려면 /etc/init.d/tomcat6이 필요합니다. 그것은 내 해결책이 아닙니다. 여기서 우분투를 실행하고 있습니다.


0

나는 같은 문제가 있었다. /etc/mysql/my.cnf 파일의 "bind-address"속성을 0.0.0.0으로 변경하면 작동합니다. my.cnf의 해당 라인은 다음과 같습니다.

바인드 주소 = 0.0.0.0

서버의 외부 IP 주소로 설정되기 전에 다음과 같이 보였습니다.

바인드 주소 = 196.152.4.145

로컬 호스트 루프가 아닌 외부 IP 주소로 설정하면 mysql 서버가 네트워크 카드에 연결되어 있고 로컬 루프의 연결을 수신하지 않습니다.


0

my.cnf 파일에서 주소를 바인딩하기 위해 로컬 주소를 사용해보십시오

연결 con = null;

    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://x62.xx8.x4x.x5:3306/mydb", "root", "root");
        try {
            System.out.println(con.getMetaData());
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (ClassNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.