두 프로그램에서 같은 문제가 발생했습니다. 내 오류는 이것이었다 :
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 설정을 변경해야하는 솔루션에 대해서는 다음을 참조하지 않아도됩니다.
해결책은 다음과 같습니다.
"바인드 주소"속성을 주석 해제하거나 다음 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 = "select now ()"를 사용하여 각 쿼리에 응답이 있는지 확인하십시오.
이 코드를 연결 문자열에 추가하십시오.
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
이러한 솔루션 중 어느 것도 나를 위해 효과가 없었지만 시도해 볼 것을 제안합니다. 이 단계를 수행하여 문제를 해결 한 사람들이 있기 때문에.
그러나 내 문제가 어떻게 해결 되었습니까? 내 문제는 데이터베이스에 많은 SELECT가 있다는 것입니다. 매번 연결을 만들고 닫았습니다. 매번 연결을 닫았지만 시스템에 많은 연결이 발생하여 오류가 발생했습니다. 내가 한 것은 연결 변수를 전체 클래스의 공용 (또는 개인) 변수로 정의하고 생성자에서 초기화하는 것입니다. 그런 다음 방금 해당 연결을 사용했습니다. 내 문제를 해결하고 속도가 크게 향상되었습니다.
결론
이 문제를 해결할 수있는 간단하고 독특한 방법은 없습니다. 자신의 상황에 대해 생각하고 위의 솔루션을 선택하는 것이 좋습니다. 프로그램 시작시이 오류가 발생하고 데이터베이스에 전혀 연결할 수 없으면 연결 문자열에 문제가있을 수 있습니다. 그러나 데이터베이스와의 몇 가지 성공적인 상호 작용 후이 오류가 발생하면 연결 수에 문제가있을 수 있으며 "wait_timeout"및 기타 MySQL 설정을 변경하거나 연결 수를 줄이는 방법을 코드에 다시 작성하십시오.