Ich arbeite daran, dass meine Datenbank mit meinen Java-Programmen kommuniziert.
Kann mir jemand mit JDBC ein schnelles und schmutziges Beispielprogramm geben?
Ich bekomme einen ziemlich erstaunlichen Fehler:
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
Inhalt der Testdatei:
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?");
}
}
Du hast also eine
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Kommunikationsverbindungsfehler
Java.net.ConnectException: Verbindung abgelehnt
Ich zitiere aus dieser Antwort die auch ein Schritt für Schritt MySQL + JDBC-Tutorial enthält:
Wenn Sie einen
SQLException: Connection refused
oderConnection timed out
oder einen MySQL-spezifischenCommunicationsException: Communications link failure
erhalten, bedeutet dies, dass die Datenbank überhaupt nicht erreichbar ist. Dies kann eine oder mehrere der folgenden Ursachen haben:
- Die IP-Adresse oder der Hostname in der JDBC-URL ist falsch.
- Der Hostname in der JDBC-URL wird vom lokalen DNS-Server nicht erkannt.
- Die Portnummer fehlt oder ist in der JDBC-URL falsch.
- DB-Server ist inaktiv.
- Der DB-Server akzeptiert keine TCP/IP-Verbindungen.
- Der DB-Server hat keine Verbindungen mehr.
- Zwischen Java und DB werden Verbindungen blockiert, z. eine Firewall oder einen Proxy .
Um das eine oder das andere zu lösen, befolgen Sie die folgenden Hinweise:
- Überprüfen und testen Sie sie mit
ping
.- Aktualisieren Sie DNS oder verwenden Sie stattdessen die IP-Adresse in der JDBC-URL.
- Überprüfen Sie es basierend auf
my.cnf
von MySQL DB.- Starten Sie die DB.
- Überprüfen Sie, ob mysqld ohne den
--skip-networking option
gestartet wurde.- Starten Sie die Datenbank neu und korrigieren Sie den Code entsprechend, sodass Verbindungen in
finally
geschlossen werden.- Deaktivieren Sie die Firewall und/oder konfigurieren Sie die Firewall/den Proxy, um den Port zuzulassen/weiterzuleiten.
Ich fange diese Ausnahme, wenn Java aus dem Heap ist. Wenn ich versuche, in RAM viele Datenelemente einzufügen, fange ich zuerst " Kommunikationsverbindungsfehler " und nächste " OutOfMemoryError " an.
Ich habe es protokolliert und ich verringere den Speicherverbrauch (lösche 1/2 Daten) und alles ok.
Diese com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
-Ausnahme tritt auf, wenn Ihre Datenbankverbindung längere Zeit inaktiv ist.
Diese Verbindung im Leerlauf gibt true für connection.isClosed();
zurück, aber wenn wir versuchen, die Anweisung auszuführen, wird diese Ausnahme ausgelöst. Ich werde vorschlagen, mit dem Datenbank-Pooling zu beginnen.
Dies ist die beste Lösung,
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/DBname", "root", "root");
Connection con = DriverManager.getConnection(
"jdbc:mysql://192.100.0.000:3306/DBname", "root", "root");
Ersetzung von Localhost in Ihre IP-Adresse
Ich habe seit Stunden das gleiche Problem. Ich verwende MAMP Server
Anstelle von localhost: [Apache-Port] verwenden Sie Ihren MySQL-Port.
Nachstehend finden Sie den Standard-MySQL-Port für den MAMP-Server.
String url = "jdbc:mysql://localhost:8889/db_name";
Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);
Ich habe hier vielleicht den falschen Baum geläutert, aber Ihre Ausnahme scheint zu bedeuten, dass Ihr MySQL-Server nicht verfügbar ist.
Ausnahme im Thread "main" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: KommunikationsverbindungsfehlerDas letzte erfolgreich an den Server gesendete Paket war 0 vor Millisekunden. Der Treiber hat keine Pakete vom Server erhalten. beim...
Was passiert, wenn Sie es versuchen (vom Terminal aus)
mysql -u username -p
Sie werden aufgefordert, das dem Benutzernamen zugeordnete Passwort einzugeben. Nachdem Sie das richtige Kennwort eingegeben haben, stellt der MySQL-Client eine Verbindung her?
Wenn nicht, müssen Sie MySQL möglicherweise über die Voreinstellungen starten. Sie können es auch so einstellen, dass es beim Start ausgeführt wird.
Frühere Antworten sind angebracht. Ich möchte aber auch auf ein allgemeineres Thema hinweisen.
Ich war mit einem ähnlichen Problem konfrontiert und der Grund war eine Netzwerkeinschränkung meines Unternehmens.
Dieselbe Verbindung wurde erfolgreich, wenn ich in einem anderen Netzwerk war.
Ich habe den gleichen Fehler erhalten, weil ich versucht habe, mein Programm auszuführen, ohne den mysql-Server zu starten.
Nach dem Start des MySQL-Servers lief alles richtig.
Laden Sie MySQL-JDBC-Type-4-Treiber (z. B. 'mysql-connector-Java-5.1.11-bin.jar' von 'mysql-connector-Java-5.1.11.Zip') unter Mysql herunter.
Sie müssen das Treiberglas während des Kompilierens und der Laufzeit in Ihren Klassenpfad einbinden.
Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
// edit the jdbc url
Connection conn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", username, password );
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery( "select * from table" );
In meinem Fall stellte sich heraus, dass die Version von mysql-connector-Java
zu hoch war.
In meiner Demo benutze ich mysql-connector-Java
irgendwie so:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>
<version>5.1.9</version>
</dependency>
In der Entwicklungsumgebung verwende ich jedoch Folgendes:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>
<version>5.1.31</version>
</dependency>
Und meine MySQL-Version war 5.1.48 (ja, es ist alt, nur um die Produktversion zu imitieren). Also traf ich den gleichen Fehler.
Da der Grund gefunden wird, wird auch die Lösung gefunden. Passen Sie die Version an!
Bitte aktualisieren Sie Ihre IP-Adresse in der Datei /etc/mysql/my.cnf
bind-address = <IP_ADDRESS>
Starten Sie den mysql-Daemon und die mysql-Dienste neu.
Wenn Sie WAMP
oder XAMP
server für die Installation der mysql-Datenbank verwenden, dann müssen Sie mysql sever auf andere Weise explizit starten. Wenn Sie eine Verbindung mit der Datenbank herstellen, wird _____com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
angezeigt
Wenn Sie Ihren Port geändert haben, wird folgende Fehlermeldung angezeigt: "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Kommunikationsverbindungsfehler" Bitte überprüfen Sie Ihre Portnummer
ich habe dieses Problem auf einfache Weise gelöst, das hat für mich funktioniert. Ich hatte das seme Problem "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Verbindungsfehler". In meiner db.properties-Datei hatte ich folgendes: url: jdbc: mysql: // localhost: 90/myDB, Entfernte nur die Port-URL, was zu dieser URL führte: urd: jdbc: mysql: // localhost/myDB und das arbeitete für mich.
Mein Problem wird durch folgende Schritte gelöst:
gehe zu my.cnf
vi /etc/mysql/my.cnf
ändern Sie seine Bindungsadresse
"#bind-address = 127.0.0.1"
starten Sie MySQL neu
Sudo /etc/init.d/mysql restart
Das ist mir passiert, als ich in meiner.ini und den php.ini-Dateien den mysql-Port von 3306 in 3307 geändert habe, aber nach dem Ändern der Ports (3307-> 3306) funktionierte es wieder einwandfrei.
Ich habe das gerade erlebt.
Muss funktionieren, indem: (Kann in den statischen Blockintializer gestellt werden)
static{ // would have to be surrounded by try catch
Class.forName("com.mysql.jdbc.Driver"); // this will load the class Driver
}
Auch durch das Herstellen der Verbindung durch:
conn = DriverManager.getConnection(DBURL,<username>,<password>);
anstatt die Login-Parameter anzugeben
Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/projects?user=user1&password=123");
Grüße.
Für Remote Anruf an Mysql
Fügen Sie remote user zu Mysql hinzu, beispielsweise IP = remoteIP:
mysql -u xxxx -p //local coonection to mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO 'theNewUser'@'remoteIP' IDENTIFIED BY 'passWord';
//Query OK, 0 rows affected (xx sec)
mysql> FLUSH PRIVILEGES;
//Query OK, 0 rows affected
Erlaube Fernzugriff für Mysql (standardmäßig sind alle externen Aufrufe nicht zulässig):
Edit
/etc/mysql/mysql.conf.d/mysqld.cnf or /etc/mysql/my.cnf
Change line: bind-address = 127.0.0.1 to
#bind-address = 127.0.0.1
Restart Mysql: /etc/init.d/mysql restart
Für die neueste Version des JDBC-Treibers gilt der JDBC:
jdbc.url='jdbc:mysql://remoteIP:3306/yourDbInstance?autoReconnect=true&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC'
jdbc.user='theNewUser'
In meinem MacBook habe ich diesen Fehler nur behoben, wenn Sie die neue Version von Eclipse EE neu installieren und lokale Server wie xampp mysql for mamp entfernen, aber nur einen von ihnen verwenden.
Versuchen Sie, localhost
in 127.0.0.1
zu ändern.
Der localhost würde in ::1
aufgelöst werden. MySQL kann standardmäßig nicht über IPv6 verbunden werden.
Und hier ist die Ausgabe von telnet localhost 3306
:
$ telnet localhost 3306
Trying ::1...
Es erfolgt keine Antwort vom MySQL-Server.
Vergewissern Sie sich natürlich, dass Ihr MySQL-Server läuft.
Es wurde versucht, eine Verbindung zu einer älteren Version von MySQL herzustellen ('Version', '5.1.73' ); Wenn Sie eine neuere Treiberversion verwenden, erhalten Sie eine Fehlermeldung, in der Sie aufgefordert werden, die "com.mysql.cj.jdbc.Driver zu verwenden oder dass Sie nicht angeben müssen, welche Sie verwenden:
Klasse
com.mysql.jdbc.Driver'. This is deprecated. The new driver class is
com.mysql.cj.jdbc.Driver 'wird geladen. Der Treiber ist automatisch über SPI registriert und manuelles Laden des Treibers Klasse ist in der Regel nicht erforderlich.
Ich habe die Deklaration geändert, um die Version 5.1.38 von mysql-connector-Java zu verwenden, und im Code habe ich die com.mysql.jdbc.Driver beibehalten.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>
<version>5.1.38</version>
</dependency>
Alles begann, als ich die Ankit Jain Antwort sah
In meinem Fall musste ich einen SSH-Tunnel für die entfernte Datenbank einrichten und alle Einstellungen waren korrekt. Die Verbindung mit PhpStorm zu testen war ebenfalls erfolgreich. Und auch das Schema wurde geladen, aber nicht die Daten. Stattdessen bekam ich:
[08S01] 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.
Keiner der oben genannten Vorschläge hat funktioniert. Aus irgendeinem Grund habe ich versucht, das Problem zu lösen, indem ich einfach PhpStorm neu starte und voila, es hat funktioniert!
Meine Firewall blockierte den Beitrag 3307, den MySQL abhört. Also habe ich den Port von 3307 auf 3306 geändert. Dann kann ich mich erfolgreich mit einer Datenbank verbinden.
Ich habe mehrere Fehler erhalten, z. B .:
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
.Ich musste hinzufügen:
Fügen Sie in AndroidManifest.xml <uses-permission Android:name="Android.permission.INTERNET"/>
Direkt nach dem öffnenden Manifest-Tag ein.
Fügen Sie den JDBC-Treiber Ihren Gradle- (oder Maven-) Abhängigkeiten hinzu.
Öffnen Sie die Datei /etc/mysql/my.cnf:change unterhalb des Parameters von
bind-address = 127.0.0.1 to bind-address = 192.168.0.3 #this is your local system IP Address
,
Führen Sie den folgenden Befehl in mysql für eine bestimmte IP-Adresse-> aus
grant all privileges on dbname.* to [email protected]'192.168.0.3' IDENTIFIED BY 'dbpassword';
Wenn Sie Zugriff auf alle IP-Adressen gewähren möchten, führen Sie den folgenden Befehl aus:
grant all privileges on dbname.* to [email protected]'%' IDENTIFIED BY 'dbpassword';
Ich hatte das gleiche Problem, als ich meine Bewerbung startete.
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.
Das Problem war, dass die Konfiguration in der mysql-Datei-etc/mysql/mysql.conf.d/mysqld.cnf so war
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
Wenn wir also sehen, dass die Bindeadresse auf 127.0.0.1 verweist, können Sie zum Starten Ihrer Anwendung die jdbc: mysql: //127.0.0.1: 3306/pizzeria anstelle von verwenden jdbc: mysql: // localhost: 3306/pizzeria , das den mysql mit der Anwendung oder einer anderen Lösung verbindet, besteht darin, dass Sie die mysql-Konfigurationen in default.oth überprüfen und ändern können wird auch für euch arbeiten.
Es könnte ein einfaches Glasproblem sein. Möglicherweise verwenden Sie einen alten mysql-connector-Java-XXX-bin.jar
, der von Ihrer aktuellen mysql-Version nicht unterstützt wird. Ich habe mysql-connector-Java-5.1.18-bin.jar
verwendet, da ich mysql 5.5
verwende, und dieses Problem ist für mich gelöst.
Möglicherweise haben Sie MySQL und Apache Server nicht gestartet. Nachdem ich den Apache-Server und MySQL von XAMPP Control Panel aus gestartet hatte, wurde die Verbindung erfolgreich hergestellt.
Viel Glück!
Ich habe den gleichen Verbindungsfehler: Das Problem, das ich habe, ist, dass ich MySQL 8.0.15 verwendet habe, aber der Java Connector ist 5.x.x.
Unten steht, wieenter code here
ich es behoben habe. 1. Laden Sie die 8.0.15 herunter. aus dem Maven-Repository: https://search.maven.org/search?q=g:mysql%20AND%20a:mysql-connector-Java
Führen Sie es erneut aus, das Problem ist behoben. \
Was für mich gelöst wurde, ist 2 Dinge zu tun: 1. Erstellen Sie einen anderen Benutzer als root mit einigen Kennwörtern mithilfe der folgenden Verbindungen:
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';
FLUSH PRIVILEGES;
2. Kommentieren Sie die IP-Adresszeile in mysqld.conf
dann mit neuem Benutzernamen und Passwort verbinden. es sollte funktionieren.
Ich hatte das gleiche Problem, und so wurde es behoben:
ResultSet (getString("columnName"))
in ein Objekt übergab, das nicht mit den Spaltennamen in meiner Datenbank übereinstimmt.Ich bin nicht genau sicher, welches Problem behoben wurde, aber es hat funktioniert. Stellen Sie außerdem sicher, dass Sie für jede Tabellenabfrage eine neue Statement
und ResultSet
erstellen.