Zusammenfassung der Ausnahmen bei der MySQL-Datenbankverbindung (sammelwürdig)

Zusammenfassung der Ausnahmen bei der MySQL-Datenbankverbindung (sammelwürdig)

Beim Bereitstellen des Projekts auf Centos ist mir ein seltsames Problem aufgefallen. Die Datenbankverbindung löste immer wieder Ausnahmen aus. Ich habe also zwei Stunden damit verbracht, nach verschiedenen Ursachen für die Datenbankverbindungsanomalien zu suchen, und schließlich war das Problem gelöst. Fassen Sie gleichzeitig die während des Lösungsprozesses gesammelten abnormalen Informationen zusammen, um Ihnen Ideen zu geben, wenn Sie auf ähnliche Probleme stoßen. Ein Muss.

Problemphänomen

Lassen Sie mich zunächst über das Problem sprechen, auf das ich gestoßen bin. Die im Projekt aufgetretenen Probleme sind sehr merkwürdig. Die Mysql-Datenbank ist auf Centos installiert und das Projekt verwendet Spring Boot.

Das Projekt wird lokal gestartet und stellt normal eine Verbindung zur Serverdatenbank her, der lokale Datenbankclient stellt normal eine Verbindung zur Serverdatenbank her und der lokale Serververbindungsclient stellt normal eine Verbindung zur Datenbank her. Die einzige Ausnahme tritt auf, wenn das Projekt auf dem Server bereitgestellt und gestartet wird.

Die Ausnahmeinformationen lauten wie folgt (die Ausnahmeinformationen wurden zu diesem Zeitpunkt nicht gespeichert):

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Kommunikationsverbindungsfehler

Das letzte erfolgreich an den Server gesendete Paket liegt 0 Millisekunden zurück. Der Treiber hat keine Pakete vom Server empfangen.
bei sun.reflect.NativeConstructorAccessorImpl.newInstance0 (native Methode)
bei sun.reflect.NativeConstructorAccessorImpl.newInstance (Unbekannte Quelle)
bei sun.reflect.DelegatingConstructorAccessorImpl.newInstance (Unbekannte Quelle)
bei java.lang.reflect.Constructor.newInstance (Unbekannte Quelle)
bei com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
bei com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:989)
bei com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:341)
bei com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2196)
bei com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2229)
bei com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2024)
bei com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:779)
bei com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
bei sun.reflect.NativeConstructorAccessorImpl.newInstance0 (native Methode)
bei sun.reflect.NativeConstructorAccessorImpl.newInstance (Unbekannte Quelle)
bei sun.reflect.DelegatingConstructorAccessorImpl.newInstance (Unbekannte Quelle)
bei java.lang.reflect.Constructor.newInstance (Unbekannte Quelle)
bei com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
bei com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:389)
bei com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)
bei java.sql.DriverManager.getConnection (Unbekannte Quelle)
bei java.sql.DriverManager.getConnection (Unbekannte Quelle)
bei com.ad.MysqlDemo.main(MysqlDemo.java:32)
Ursache: java.net.ConnectException: Verbindung abgelehnt: connect
bei java.net.DualStackPlainSocketImpl.connect0 (native Methode)
bei java.net.DualStackPlainSocketImpl.socketConnect (Quelle unbekannt)
bei java.net.AbstractPlainSocketImpl.doConnect (Quelle unbekannt)
bei java.net.AbstractPlainSocketImpl.connectToAddress (Unbekannte Quelle)
bei java.net.AbstractPlainSocketImpl.connect (Quelle unbekannt)
bei java.net.PlainSocketImpl.connect (Quelle unbekannt)
bei java.net.SocksSocketImpl.connect (Quelle unbekannt)
bei java.net.Socket.connect (Quelle unbekannt)
bei com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:211)
bei com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:300)
... 15 mehr

Abnormale Ursache

Habe fast alle Lösungen im Internet ausprobiert, aber ohne Erfolg. Allmählich kam mir der Verdacht, dass die Ursache beim JDK lag. Die lokal verwendete JDK-Version ist 1.8.0_151, und der Server verwendet 1.8.0.242. Theoretisch gibt es keine Auswirkungen.

Also habe ich das JDK auf dem Server deinstalliert, das Installationspaket von der offiziellen Website heruntergeladen und 1.8.0_241 neu installiert. Das Datenbankverbindungsproblem verschwand.

Später dachte ich sorgfältig darüber nach und stellte fest, dass es kein Problem mit der Nebenversionsnummer war, sondern ein Problem mit der installierten JDK-Version. Das auf diesem Computer installierte JDK wurde von der offiziellen Oracle-Website heruntergeladen und der Speicher auf dem Server wurde der Einfachheit halber direkt mit dem Befehl yum installiert. OpenJDK ist standardmäßig auf CentOS installiert. Wir wissen, dass JDK und OpenJDK nach JDK7 zu zwei Versionen mit unterschiedlichen Lizenzvereinbarungen gehören, der OpenJDK-Quellcode unvollständig ist und OpenIDK nur das am stärksten optimierte JDK enthält.

Nachfolgend teilen wir weitere Gründe mit, die bei der Suche nach den oben genannten Ausnahmen gefunden wurden und zu ähnlichen Ausnahmen sowie deren Lösungen führen.

Sockenpfadproblem

Das Problemphänomen ist das gleiche wie oben. Außer dass die auf dem Server bereitgestellte Anwendung keine Verbindung zum Server herstellen kann, können andere Methoden eine Verbindung zur Datenbank herstellen.

Die Ursache des Problems ist: Der Server verfügt über zwei Festplatten, und in der Mitte wurde der Befehl mv ausgeführt, um den Speicherinhalt der Datenbank zu verschieben, und gleichzeitig wurde das Datenverzeichnis so geändert, dass es auf das neue Verzeichnis verweist.

Ergebnis: Die lokale Verbindung über das JAVA-Programm ist fehlgeschlagen und die Ausnahme „org.apache.commons.dbcp.SQLNestedException: PoolableConnectionFactory kann nicht erstellt werden (Fehler der Kommunikationsverbindung)“ wurde ausgelöst.

Lösung: Überprüfen Sie nach der Änderung der entsprechenden Datadir-Konfiguration die Konfiguration des Dateipfads mysql.sock. Standardmäßig befindet es sich in /var/lib/mysql/mysql.sock oder /temp/mysql.sock. Ändern Sie dann alle Terminals ([Client], [mysql], [mysqld] usw.), sodass sie denselben Pfad verwenden.

Probleme mit der SSL-Verbindung

Wenn in einer Meldung die folgenden ungewöhnlichen Informationen enthalten sind:

javax.net.ssl.SSLHandshakeException: Kein geeignetes Protokoll (Protokoll ist deaktiviert oder Verschlüsselungssammlungen sind ungeeignet)
bei sun.security.ssl.Handshaker.activate(Handshaker.java:529)
bei sun.security.ssl.SSLSocketImpl.kickstartHandshake(SSLSocketImpl.java:1492)
bei sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1361)
bei sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
bei sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)

Möglicherweise liegt ein Problem mit der SSL-Verbindung vor. Ein Freund im Internet stieß nach dem Upgrade auf jdk1.8 auf die obige Ausnahme.

Lösung: Entfernen Sie SSLv3. Suchen Sie in der Datei JAVA_HOME/jre/lib/security/java.security die Konfiguration zu jdk.tls.disabledAlgorithns=SSLv3,... und löschen Sie den SSLv3-Teil. Durch das Löschen von SSLv3 werden SSL-Anrufe ermöglicht.

In Bezug auf das SSL-Verbindungsproblem gibt es eine andere Situation, in der Mysql eine SSL-Verbindung verwendet. Informationen zur Konfiguration finden Sie in diesem Artikel: https://www.jb51.net/article/100432.htm.

Timeout der Datenbankverbindung

Diese Situation ist eine gängige Information im Internet, und es gibt eine große Anzahl von Artikeln, aber sie erklären oft nicht das spezifische Szenario: Eine Ausnahme ähnlich der oben genannten tritt während der Verwendung der Anwendung auf. Beachten Sie, dass dies während der Verwendung geschieht, nicht während des Starts.

Der Grund für die Ausnahme während der Verwendung liegt darin, dass das Standard-„wait_timeout“ des MySQL-Servers 8 Stunden (28800 Sekunden) beträgt. Das heißt, wenn eine Verbindung länger als 8 Stunden im Leerlauf (inaktiv) ist, trennt MySQL die Verbindung automatisch. Der Verbindungspool geht jedoch davon aus, dass die Verbindung noch gültig ist (da die Gültigkeit der Verbindung nicht überprüft wurde). Wenn die Anwendung die Verwendung der Verbindung beantragt, tritt der obige Fehler auf.

Lösung: Ändern Sie die my.ini-Konfiguration, erhöhen Sie die Timeout-Zeit oder fügen Sie der Verbindungs-URL „&autoReconnect=true“ hinzu.

Fügen Sie die folgende Konfiguration unter Port=3306 hinzu:

Wartezeitüberschreitung = 31536000
interactive_timeout=31536000

Starten Sie dann MySQL neu.

Diese Situation kann auch durch die maxIdleTime-Konfiguration des Datenbankverbindungspools verursacht werden.

<!-- Maximale Leerlaufzeit. Wenn sie nicht innerhalb von 60 Sekunden verwendet wird, wird die Verbindung verworfen. Wenn der Wert 0 ist, wird er nie verworfen. Standardmäßig: 0 -->  
<Eigenschaftsname="maxIdleTime" Wert="0"></Eigenschaft>

Da die MySQL-Verbindung geschlossen wird, wenn sie länger als 8 Stunden inaktiv ist, der Verbindungspool die Verbindung jedoch niemals verwirft und die Verbindung als gültig betrachtet (da die Gültigkeit der Verbindung nicht überprüft wird), tritt der obige Fehler auf, wenn die Anwendung die Verwendung der Verbindung beantragt.

Lösung: Setzen Sie den Wert auf 20.

Andere Ursachen

Natürlich gibt es noch viele weitere Gründe für ähnliche Ausnahmen bei MySQL-Verbindungen:

  • Problem mit den Zugriffsrechten für das Datenbankkonto: Geben Sie die IP- und Kontoautorisierung an.
  • Problem mit den Netzwerkberechtigungen: Ist die Firewall mit den entsprechenden Zugriffsberechtigungen aktiviert?
  • Portproblem: Ist der aufgerufene Port korrekt? Ist die Firewall-Berechtigung für den Port aktiviert?
  • Problem mit dem Kontokennwort: Das Kontokennwort ist falsch oder das Konto hat keine Zugriffsrechte auf die angegebene IP-Adresse.
  • Problem mit dem Datenbanktreiber: Die Version des Datenbanktreibers stimmt nicht mit der Datenbankversion überein.
  • Probleme mit der Netzwerkstabilität: Probleme, die durch ein instabiles Netzwerk verursacht werden.
  • Problem mit dem Datenbankverbindungspool: Der Datenbankverbindungspool ist zu groß konfiguriert, was zu unzureichenden Standard-MySQL-Verbindungen führt.
  • Das Problem von IPv4 und IPv6.

Oben finden Sie eine detaillierte Zusammenfassung der Ausnahmen bei MySQL-Datenbankverbindungen. Weitere Informationen zu Ausnahmen bei MySQL-Datenbankverbindungen finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Detaillierte Schritte zur Verwendung von IDEA zum Konfigurieren von Tomcat und Herstellen einer Verbindung mit einer MySQL-Datenbank (JDBC)
  • Wenn Navicat Premium eine Verbindung zur Datenbank herstellt, wird die Fehlermeldung „2003 Verbindung zum MySQL-Server auf „localhost“ nicht möglich (10061)“ angezeigt.
  • Detaillierte Erklärung zur Verbindung mit einer MySQL-Datenbank mit Java in IntelliJ IDEA
  • Android stellt eine Verbindung zur MySQL-Datenbank her und führt Hinzufügungs-, Lösch-, Änderungs- und Abfragevorgänge aus
  • So stellen Sie mit Node-Red eine Verbindung zur MySQL-Datenbank her

<<:  Tutorial zur Installation von MySQL8 auf Centos7

>>:  JavaScript zum Erzielen eines einfachen Drag-Effekts

Artikel empfehlen

Detaillierte Erklärung der Verwendung des MySQL-Paradigmas

1. Paradigma Der englische Name des Paradigmas la...

So konfigurieren Sie /var/log/messages im Ubuntu-Systemprotokoll

1. Problembeschreibung Heute muss ich die Systemp...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.7.17

In diesem Artikel wird die Installations- und Kon...

So verstehen Sie die JS-Funktion Anti-Shake und Funktionsdrosselung

Inhaltsverzeichnis Überblick 1. Funktion Entprell...

Über die MariaDB-Datenbank unter Linux

Inhaltsverzeichnis Über die MariaDB-Datenbank unt...

Details zur Verwendung des Vue-Slots

Inhaltsverzeichnis 1. Warum Slots verwenden? 1.1 ...

Einführung in die Verwendung von exists und except in SQL Server

Inhaltsverzeichnis 1. existiert 1.1 Beschreibung ...

JavaScript Factory Pattern erklärt

Inhaltsverzeichnis Einfache Fabrik Fabrikmethode ...

Python schreibt die Ausgabe in den CSV-Vorgang

Wie unten dargestellt: def test_write(selbst): Fe...

So verweisen Sie direkt auf Vue und Element-UI in HTML

Der Code sieht folgendermaßen aus: <!DOCTYPE h...