Zainstalowałem standardową instalację mysql 5.5 i chociaż mogę połączyć się z usługą mysql za pomocą komendy mysql, a usługa wydaje się być uruchomiona, nie mogę się z nią połączyć przez spring + tomcat lub z zewnętrznego złącza jdbc.
Używam następującego adresu URL:
jdbc:mysql://myserver.com:myport/mydb
z prawidłową nazwą użytkownika / hasłem, ale otrzymuję następujący komunikat:
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.
i kocur rzuca:
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)
Co wydaje się być takim samym problemem, jak gdybym próbował połączyć się zewnętrznie.
Odpowiedzi:
Może się to zdarzyć z różnych powodów. Właśnie widziałem to kilka tygodni temu, ale nie pamiętam, jaka była poprawka dla mnie.
1) Sprawdź, czy adres, z którym związany jest mysql, jest prawdopodobnie 127.0.0.1 (tylko), który moim zdaniem jest domyślny (przynajmniej na standardowym serwerze Ubuntu). Będziesz musiał skomentować parametr bind-address w my.cnf, aby powiązać ze wszystkimi dostępnymi adresami (nie możesz wybrać wielu, to jeden lub wszystkie).
2) Jeśli jest powiązany z 127.0.0.1 i nie można połączyć się za pomocą „localhost”, upewnij się, że nie jest on przetwarzany na adres localhost IPv6 zamiast IPv4. (lub po prostu użyj adresu IP)
3) Sprawdź dwukrotnie i potrójnie port, na którym nasłuchuje mysql.
4) Upewnij się, że używasz odpowiedniego złącza JDBC dla swojego JDK.
5) Upewnij się, że nie robisz czegoś naprawdę głupiego, jak uruchamianie mysql z --skip-networking.
Myślę, że moja pierwsza sugestia jest najbardziej obiecująca ... tak naprawdę myślę, że właśnie tam ją ostatnio widziałem ... Próbowałem połączyć się zdalnie z mysql (także na Ubuntu 8.04).
źródło
Miałem ten sam problem w dwóch moich programach. Mój błąd był następujący:
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:
Linux: /etc/my.cnf
Windows: D: \ Program Files \ mysql \ bin \ my.ini
Oto rozwiązania:
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”
Jeśli w pliku konfiguracyjnym MySQL znajduje się wiersz „pomiń połączenie sieciowe”, dodaj komentarz, dodając znak „#” na początku tego wiersza.
Dodaj następujące wiersze do pliku konfiguracyjnego MySQL:
wait_timeout = liczba
czas_interaktywny = liczba
connect_timeout = liczba
Upewnij się, że Fire wall lub antywirusowe produkty miękkie nie blokują usługi MySQL.
Sprawdź ciąg zapytania. ciąg połączenia powinien wyglądać mniej więcej tak:
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:
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.
„ 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ń TOMCAT6_SECURITY = tak na TOMCAT6_SECURITY = nie
użyj validationQuery = "wybierz teraz ()", aby upewnić się, że każde zapytanie ma odpowiedzi
Dodaj ten kod do ciągu połączenia:
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ń.
źródło
Jeśli prowadzisz instalację Linuksa, prawdopodobnie masz pakiet lokkit blokujący komunikację przychodzącą, z wyjątkiem SSH.
Zaloguj się jako root i uruchom polecenie lokkit z wiersza poleceń, wyłącz zaporę i SElinux i sprawdź, czy masz ten sam problem.
Sprawdź także, czy uprawnienia zostały ustawione poprawnie, aby wszystko mogło zapisywać w odpowiednich lokalizacjach.
źródło
Istnieje również ten ogromny błąd w wersji 5.1.9 sterownika mysql-jdbc:
http://bugs.mysql.com/bug.php?id=47494
źródło
Może to być również spowodowane niewłaściwymi ustawieniami proxy . Miałem ten problem podczas próby połączenia za pośrednictwem jdbc z instancją MySQL działającą w urządzeniu wirtualnym Parallels na moim komputerze Mac. Połączenie jdbc korzysta z ustawień sieciowych na poziomie systemu, a ponieważ byłem za serwerem proxy SOCKS, musiałem ustawić host MySql jako host bez serwera proxy (np. Na komputerze Mac możesz to skonfigurować w Ustawienia-> Sieć-> Zaawansowane- > Proxy i na koniec dodaj nazwę hosta lub adres IP w „Pomiń ustawienia proxy dla tych hostów i domen”).
źródło
MySQL Connector / J obsługuje tylko TCP / IP Java nie obsługuje połączeń z gniazdami domenowymi w systemie Unix
Jeśli MYSQL zostanie uruchomiony z flagą pomijania sieci lub jeśli MySQL działa za zaporą, wówczas opcja TCP / IP jest wyłączona. Aby Java nie mogła komunikować się z MySQL.
źródło
przez prawie cały dzień miałem bardzo podobny problem i doprowadzało mnie to do szału! ale udało mi się znaleźć rozwiązanie i było to bardzo, bardzo proste, wystarczy /etc/init.d/tomcat6, aby zmienić TOMCAT6_SECURITY = tak na TOMCAT6_SECURITY = nie. to nie jest moje rozwiązanie, znalazłem to tutaj , jak widać, działam na Ubuntu, mam nadzieję, że to zadziała.
źródło
Miałem ten sam problem. Zmieniono właściwość „bind-address” w pliku /etc/mysql/my.cnf na 0.0.0.0 i działa. Odpowiednia linia w my.cnf wygląda następująco:
adres powiązania = 0.0.0.0
Zanim został ustawiony na zewnętrzny adres IP serwera, więc wyglądał mniej więcej tak:
adres powiązania = 196.152.4.145
Myślę, że kiedy jest ustawiony na zewnętrzny adres IP, a nie na pętlę localhost, serwer mysql jest podłączony do karty sieciowej i nie nasłuchuje połączeń z pętli lokalnej.
źródło
wypróbuj adres lokalny, aby powiązać adres w pliku my.cnf
Con con = null;
źródło