Miałem ten sam problem w dwóch moich programach. Mój błąd był następujący:
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.
Spędzam kilka dni, aby rozwiązać ten problem. Przetestowałem wiele podejść wymienionych na różnych stronach internetowych, ale żadne z nich nie działało. W końcu zmieniłem kod i dowiedziałem się, na czym polega problem. Spróbuję opowiedzieć ci o różnych podejściach i podsumuję je tutaj .
Gdy szukałem Internetu w celu znalezienia rozwiązania tego błędu, zorientowałem się, że istnieje wiele rozwiązań, które działały dla co najmniej jednej osoby, ale inni twierdzą, że to nie działa! dlaczego istnieje wiele podejść do tego błędu?
Wygląda na to, że ten błąd może wystąpić na ogół, gdy występuje problem z połączeniem z serwerem . Być może problem wynika z niewłaściwego ciągu zapytania lub zbyt dużej liczby połączeń z bazą danych.
Proponuję więc wypróbować wszystkie rozwiązania jeden po drugim i nie poddawaj się!
Oto rozwiązania, które znalazłem w Internecie i dla każdego z nich jest przynajmniej osoba, której problem został rozwiązany za pomocą tego rozwiązania.
punkt: W przypadku rozwiązań, które musisz zmienić ustawienia MySQL, możesz odnieść się do następujących kwestii:
Oto rozwiązania:
- zmiana atrybutu „bind-address”
Odkomentuj atrybut „bind-address” lub zmień go na jeden z następujących Ips:
bind-address = "127.0.0.1"
lub
adres powiązania = „0.0.0.0”
- komentując „skip-networking”
Jeśli w pliku konfiguracyjnym MySQL znajduje się wiersz „pomiń połączenie sieciowe”, dodaj komentarz, dodając znak „#” na początku tego wiersza.
- zmień „wait_timeout” i „Interactive_timeout”
Dodaj następujące wiersze do pliku konfiguracyjnego MySQL:
wait_timeout = liczba
czas_interaktywny = liczba
connect_timeout = liczba
- sprawdź ustawienia proxy systemu operacyjnego
Upewnij się, że Fire wall lub antywirusowe produkty miękkie nie blokują usługi MySQL.
- zmień parametry połączenia
Sprawdź ciąg zapytania. ciąg połączenia powinien wyglądać mniej więcej tak:
dbName = "my_database";
dbUserName = "root";
dbPassword = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";
Upewnij się, że w łańcuchu nie ma spacji. Cały ciąg połączenia powinien być kontynuowany bez żadnych spacji.
Spróbuj zastąpić „localhost” swoim portem, np. 127.0.0.1. Spróbuj także dodać numer portu do ciągu połączenia, na przykład:
String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";
Zwykle domyślnym portem dla MySQL jest 3306.
Nie zapomnij zmienić nazwy użytkownika i hasła na nazwę użytkownika i hasło do serwera MySQL.
- zaktualizuj plik biblioteki sterownika JDK
- przetestuj różne JDK i JRE (jak JDK 6 i 7)
- nie zmieniaj pakietu max_allowed_packet
„ max_allowed_packet ” to zmienna w pliku konfiguracyjnym MySQL, która wskazuje maksymalny rozmiar pakietu, a nie maksymalną liczbę pakietów. Więc to nie pomoże rozwiązać tego błędu.
- zmień bezpieczeństwo tomcat
zmień TOMCAT6_SECURITY = tak na TOMCAT6_SECURITY = nie
- użyj właściwości validationQuery
użyj validationQuery = "wybierz teraz ()", aby upewnić się, że każde zapytanie ma odpowiedzi
- Automatyczne wznawianie połączenia
Dodaj ten kod do ciągu połączenia:
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
Chociaż żadne z tych rozwiązań nie działało, proponuję je wypróbować. Ponieważ są ludzie, którzy rozwiązali problem z wykonaniem tych kroków.
Ale co rozwiązało mój problem? Mój problem polegał na tym, że miałem wiele SELECT w bazie danych. Za każdym razem tworzyłem połączenie, a następnie je zamykałem. Chociaż za każdym razem zamykałem połączenie, ale system napotkał wiele połączeń i dał mi ten błąd. Zrobiłem to, że zdefiniowałem zmienną połączenia jako zmienną publiczną (lub prywatną) dla całej klasy i zainicjowałem ją w konstruktorze. Potem za każdym razem korzystałem z tego połączenia. Rozwiązało to mój problem, a także znacznie zwiększyło moją prędkość.
Wniosek
Nie ma prostego i unikalnego sposobu rozwiązania tego problemu. Sugeruję, abyś pomyślał o swojej sytuacji i wybrał powyższe rozwiązania. Jeśli weźmiesz ten błąd na początku programu i w ogóle nie będziesz w stanie połączyć się z bazą danych, możesz mieć problem z ciągiem połączenia. Ale jeśli weźmiesz ten błąd po kilku udanych interakcjach z bazą danych, problem może wynikać z liczby połączeń i możesz pomyśleć o zmianie „wait_timeout” i innych ustawień MySQL lub przepisać kod, aby zmniejszyć liczbę połączeń.