Pracuję nad tym, aby moja baza danych komunikowała się z moimi programami Java.
Czy ktoś może mi dać szybki i brudny program przykładowy za pomocą JDBC?
Dostaję dość głupi błąd:
Exception in thread "main" 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:409)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2260)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:787)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49)
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:409)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:207)
at SqlTest.main(SqlTest.java:22)
Caused by: 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:409)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2181)
... 12 more
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
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:256)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:293)
... 13 more
Zawartość pliku testowego:
import com.mysql.jdbc.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SqlTest {
public static void main(String [] args) throws Exception {
// Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
// // edit the jdbc url
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/projects?user=user1&password=123");
// Statement st = conn.createStatement();
// ResultSet rs = st.executeQuery( "select * from table" );
System.out.println("Connected?");
}
}
Odpowiedzi:
Więc masz
Cytuję z tej odpowiedzi, która zawiera także samouczek MySQL + JDBC:
Zobacz też:
źródło
Łapię ten wyjątek, gdy Java jest poza stertą. Jeśli spróbuję umieścić w pamięci RAM wiele elementów danych - najpierw łapię „ Awaria łącza komunikacyjnego ”, a następnie „ OutOfMemoryError ”.
Zalogowałem to i zmniejszam zużycie pamięci (usuwam 1/2 danych) i wszystko w porządku.
źródło
W moim przypadku musiałem zastąpić Localhost rzeczywistym adresem IP serwera bazy danych
Zamiast
potrzebowałem
źródło
Ten
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
wyjątek występuje, jeśli połączenie z bazą danych jest bezczynne przez długi czas.To bezczynne połączenie zwraca wartość true,
connection.isClosed();
ale jeśli spróbujemy wykonać instrukcję, uruchomi ten wyjątek, więc zasugeruję skorzystanie z puli bazy danych.źródło
Mam ten sam problem od wielu godzin. Używam serwera MAMP
Zamiast używać localhost: [Port Apache], użyj portu MySQL.
Poniżej znajduje się domyślny port MySQL dla serwera MAMP.
źródło
Być może szczekam tutaj niewłaściwe drzewo, ale twój wyjątek wydaje się wskazywać, że twój serwer MySQL jest niedostępny.
Co się stanie, jeśli spróbujesz (z terminala)
Zostaniesz poproszony o podanie hasła związanego z nazwą użytkownika. Czy po podaniu prawidłowego hasła klient mysql łączy się?
Może być konieczne uruchomienie MySQL z Preferencji, jeśli nie. Możesz także ustawić, aby działał podczas uruchamiania.
źródło
localhost
, używam poprawnej nazwy użytkownika / hasła i działa dobrze.W moim przypadku okazało się, że wersja
mysql-connector-java
była za stara.W mojej wersji demonstracyjnej używam w
mysql-connector-java
ten sposób:Ale w środowisku programistycznym używam tego:
Moja wersja MySQL to 5.1.48 (tak, jest stara, tylko naśladując wersję produktu). Więc spotkałem ten sam błąd.
Ponieważ znaleziono przyczynę, znaleziono również rozwiązanie. Dopasuj wersję!
źródło
Wystąpił ten sam błąd, ponieważ próbowałem uruchomić program bez uruchamiania serwera mysql.
Po uruchomieniu serwera mysql wszystko poszło dobrze.
źródło
Wcześniejsze odpowiedzi są odpowiednie. Chciałbym jednak zwrócić uwagę na bardziej ogólny problem.
Napotkałem podobny problem, a przyczyną było ograniczenie sieci mojej firmy.
To samo połączenie było udane, gdy byłem w innej sieci.
źródło
Zaktualizuj swój adres IP w pliku /etc/mysql/my.cnf
Uruchom ponownie usługi deamon i mysql mysql.
źródło
Pobierz MySQL-JDBC-Type-4-Treiber (ig 'mysql-connector-java-5.1.11-bin.jar' z 'mysql-connector-java-5.1.11.zip') z MySQL .
Musisz wprowadzić słoik sterownika podczas kompilacji i środowiska wykonawczego w ścieżce klasy.
źródło
Ten błąd może również wystąpić, jeśli Java spróbuje połączyć się z MySQL przez SSL, ale coś pójdzie nie tak. (W moim przypadku konfigurowałem pule połączeń Payara Server 5.193.1 z MySQL.)
Niektórzy sugerowali ustawienie
useSSL=false
. Jednak od wersji Connector / J8.0.13
to ustawienie jest nieaktualne. Oto fragment właściwości konfiguracji MySQL Connector / J 8.0 :W moim przypadku ustawienie
sslMode=DISABLED
było wszystkim, czego potrzebowałem, aby rozwiązać problem. To było na maszynie testowej. Ale w przypadku produkcji bezpiecznym rozwiązaniem byłoby prawidłowe skonfigurowanie klienta Java i serwera MySQL do korzystania z protokołu SSL.Zauważ, że wyłączenie SSL może wymagać również ustawienia
allowPublicKeyRetrieval=true
. (Ponownie, nie jest to mądra decyzja z punktu widzenia bezpieczeństwa). Więcej informacji znajduje się w Opcjach MySQL ConnectionString :źródło
Ten sam problem został rozwiązany przez następujące kroki:
Iść do
my.cnf
Zmodyfikuj jego adres powiązania
Uruchom ponownie MySQL
źródło
Jeśli używasz
WAMP
lubXAMP
serwer, aby zainstalować bazę danych mysql. Następnie musisz jawnie uruchomić mysql, w przeciwnym razie pokaże sięcom.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
podczas łączenia z bazą danychźródło
rozwiązałem ten problem w łatwy sposób, który zadziałał dla mnie. miałem problem z seme „com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Błąd łącza komunikacyjnego”. W moim pliku db.properties miałem to: url: jdbc: mysql: // localhost: 90 / myDB, tylko usunąłem adres URL portu, w ten sposób url: jdbc: mysql: // localhost / myDB i to działało dla mnie .
źródło
Zdarzyło mi się to, kiedy zmieniłem port mysql z 3306 na 3307 w plikach my.ini i php.ini, ale po zmianie portów (3307-> 3306) znów działało dobrze.
źródło
Jeśli zmieniłeś port, pojawia się taki błąd „com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Błąd łącza komunikacyjnego” Sprawdź numer portu
źródło
Właśnie tego doświadczyłem.
Musi sprawić, aby działał przez: (można to umieścić w statycznym module inicjującym blok)
Również poprzez uzyskanie połączenia poprzez:
zamiast określać parametry logowania
Pozdrowienia.
źródło
Spróbuj zmienić
localhost
na127.0.0.1
.Host lokalny zostanie rozwiązany
::1
. MySQL nie może być domyślnie podłączony przez IPv6.A oto wynik
telnet localhost 3306
:I nie ma odpowiedzi z serwera MySQL.
Oczywiście, upewnij się, że twój serwer MySQL jest uruchomiony.
źródło
jeśli mysql wersja 8 lub wyższa zaktualizowane przez użytkownika złącze
źródło
Do zdalnego połączenia z MySQL
Dodaj użytkownika zdalnego do MySQL z np. IP = remoteIP:
Zezwalaj na zdalny dostęp do MySQL (domyślnie wszystkie połączenia zewnętrzne nie są dozwolone):
W najnowszej wersji sterownika JDBC sterownik JDBC:
źródło
Miałem ten sam problem i oto jak to naprawić:
ResultSet (getString("columnName"))
które nie pasowały do nazw kolumn w mojej bazie danych.Nie jestem pewien, który z nich rozwiązał problem, ale zadziałał. Należy także pamiętać, że tworzenie nowego
Statement
iResultSet
dla każdego zapytania tabeli.źródło
Może to być prosty problem ze słoikiem. być może używasz starego,
mysql-connector-java-XXX-bin.jar
który nie jest obsługiwany przez twoją bieżącą wersję mysql. Użyłemmysql-connector-java-5.1.18-bin.jar
tak, jak używammysql 5.5
i ten problem został dla mnie rozwiązany.źródło
Być może nie uruchomiłeś serwera MySQL i Apache. Po uruchomieniu serwera Apache i MySQL z Panelu sterowania XAMPP połączenie zostało nawiązane.
Powodzenia!
źródło
Rozwiązaniem dla mnie jest zrobienie 2 rzeczy: 1. Stwórz nowego użytkownika innego niż root za pomocą hasła używając następujących konektorów:
2. komentarz linia adresu IP na mysqld.conf
następnie połącz się z nową nazwą użytkownika i hasłem. powinno działać.
źródło
Próbował połączyć się ze starszą wersją MySQL („wersja”, „5.1.73”); podczas korzystania z nowszej wersji sterownika pojawia się błąd, który mówi o użyciu pliku „com.mysql.cj.jdbc.Driver lub nawet nie musisz określać, którego używasz:
Zmieniłem deklarację, aby użyć wersji 5.1.38 mysql-connector-java i, w kodzie, zachowałem com.mysql.jdbc.Driver .
Wszystko zaczęło się, kiedy zobaczyłem ankit Jain za odpowiedź
źródło
Mój firewall blokował post 3307, na którym nasłuchuje MySQL. Więc zmieniłem port z 3307 na 3306, a następnie mogę pomyślnie połączyć się z bazą danych.
źródło
W moim MacBooku rozwiązałem ten błąd tylko po ponownym zainstalowaniu nowej wersji Eclipse EE i usunięciu lokalnych serwerów, takich jak xamp mysql lub mamp, ale używam tylko jednego z nich ...
źródło
W moim przypadku musiałem założyć tunel ssh do zdalnej bazy danych i wszystkie ustawienia były prawidłowe, a testowanie połączenia z PhpStorm również zakończyło się powodzeniem. A także schemat został załadowany, ale nie dane. Zamiast tego dostałem:
Żadna z powyższych sugestii nie zadziałała. Z jakiegokolwiek powodu próbowałem rozwiązać problem, po prostu ponownie uruchamiając PhpStorm i voila zadziałało!
źródło
Otrzymywałem wiele błędów, takich jak:
CommunicationsException: Communications link failure
java.lang.NullPointerException: Attempt to invoke interface method 'java.sql.Statement java.sql.Connection.createStatement()' on a null object reference at
.Musiałem dodać:
W AndroidManifest.xml dołącz
<uses-permission android:name="android.permission.INTERNET"/>
tuż po otwierającym tekście manifestu.Dodaj sterownik JDBC do swoich zależności Gradle (lub Maven).
źródło