it-swarm.com.de

Die Verbindung mit MySql wird automatisch abgebrochen. Wie konfiguriert man Connector/J richtig?

Ich habe diesen Hinweis aus der Fehlermeldung gelesen:

Sie sollten erwägen, entweder zu verfallen und/oder Testen der Verbindungsgültigkeit Vor der Verwendung in Ihrer Anwendung Erhöhen des konfigurierten Servers Werte für Client-Timeouts oder die Verwendung von die Connector/J-Verbindungseigenschaft 'autoReconnect = true', um dies zu vermeiden Problem.

Ich verwende Spring und JPA. Wo muss ich Connector/J konfigurieren? (in persistence.xml oder in entityManagerFactory Federkonfiguration oder in dateSource Federkonfiguration oder an anderer Stelle?) 

45
Roman

Der Text beschreibt drei Lösungen, um Verbindungsabbrüche zu verhindern:

  1. Konfigurieren Sie die Verbindungszeichenfolge mit autoReconnect=true. Dies ist eine Eigenschaft der URL-Verbindungszeichenfolge, die auf Treiberebene funktioniert. Sie müssen die Verbindungszeichenfolge in der Datenquellenkonfiguration ändern.

    url="jdbc:mysql://localhost:3306/confluence?autoReconnect=true"
    
  2. Erhöhen Sie das Timeout. Dies ist normalerweise eine Eigenschaft der Datenbank. Sie können diesen Wert erhöhen, um zu sehen, ob weniger Verbindungsabbruch auftritt.

  3. Konfigurieren Sie den Verbindungspool zum Testen der Verbindungsgültigkeit. Dies geschieht am Pool, nicht auf der Fahrerebene. Dies hängt von der von Ihnen verwendeten Datenquellenimplementierung ab. Es sollte jedoch in der Eigenschaft der Datenquelle konfigurierbar sein, wenn Sie eine gepoolte Quelle verwenden, z. c3p0 .

Zusätzliche Kommentare:

  • Die Datenquelle/der Pool kann auch eine Zeitüberschreitung haben, die der Zeit entspricht, zu der eine freie Verbindung im Pool verbleibt. Nicht mit dem DB-Timeout zu verwechseln.
  • Es gibt mehrere Möglichkeiten, die Gültigkeit einer Verbindung zu testen. Ein üblicher Weg ist die Dummy-Testtabelle. Der Pool gibt eine Auswahl für die Dummy-Testtabelle aus, um zu sehen, ob die Verbindung noch in Ordnung ist. 
62
ewernli

AutoReconnect wird nicht empfohlen. Aus MySQL hier

Sollte der Fahrer versuchen, veraltete und/oder tote Verbindungen wiederherzustellen? Wenn aktiviert, gibt der Treiber eine Ausnahme für eine Abfrage aus, die unter .__ ausgegeben wird. eine veraltete oder tote Verbindung, die zur aktuellen Transaktion gehört, Es wird jedoch versucht, die Verbindung wiederherzustellen, bevor die nächste Abfrage in der .__ ausgegeben wird. Verbindung in einer neuen Transaktion. Die Verwendung dieser Funktion ist nicht empfohlen, da es Nebenwirkungen hat, die sich auf den Sitzungsstatus und .__ beziehen. Datenkonsistenz, wenn Anwendungen SQLExceptions .__ nicht verarbeiten. richtig und ist nur für die Verwendung konzipiert, wenn Sie nicht Konfigurieren Sie Ihre Anwendung für die Behandlung von SQLExceptions, die sich aus einem Dead ergeben und alte Verbindungen richtig. Alternativ kann als letzte Option Untersuchen Sie, wie Sie die MySQL-Servervariable "wait_timeout" auf einen hohen Wert setzen Wert statt der Standardeinstellung von 8 Stunden.

18
Gaurav Agarwal

Ich habe viele Lösungen durchlaufen und mein Problem wurde gelöst, aber nach einiger Zeit ist die Verbindung unterbrochen oder die Verbindung unterbrochen. Nach 2 bis 3 Tagen habe ich eine Lösung gefunden, die mein Problem löst. 

viele Lösungen schlagen vor, autoReconnect = true zu verwenden, aber als ich die Docs durchgegangen bin. Ich habe den folgenden Text in der Quelle gesehen, der den Parameter autoReconnect beschreibt: 

Die Verwendung dieser Funktion wird nicht empfohlen, da sie mit dem Sitzungsstatus und der Datenkonsistenz Nebenwirkungen hat 

Als ich in den Hibernate-Code sah. Der grundlegende Verbindungsmechanismus von Hibernate unterstützt keine Wiederverbindung, man muss den H3C0-Verbindungspool verwenden (der die Wiederverbindung nicht immer unterstützte).

Wenn jedoch einmal H3C0 verwendet wurde, scheint das Standardverhalten zu sein, eine Anforderung zu verarbeiten. Wenn die Verbindung abgebrochen ist, wird dem Benutzer ein Fehler angezeigt - es wird jedoch mindestens eine Verbindung zur nächsten Anforderung hergestellt. Ich vermute, ein Fehler ist besser als unendliche Fehler, aber immer noch nicht so gut wie Null Fehler. Es stellt sich heraus, dass man die Option testConnectionOnCheckout benötigt, die in der Dokumentation nicht empfohlen wird, da das Testen der Verbindung vor einer Anforderung zu einer geringeren Leistung führen kann. Sicher muss die Software erstens funktionieren, nur zweitens muss sie schnell arbeiten.

Um zusammenzufassen, um eine Verbindung zu „work“ zu erhalten (was ich als das Verwalten unterbrochener Verbindungen durch erneutes Verbinden ohne Fehler definiert):

  <!-- hibernate.cfg.xml -->
    <property name="c3p0.min_size">5</property>
    <property name="c3p0.max_size">20</property>
    <property name="c3p0.timeout">1800</property>
    <property name="c3p0.max_statements">50</property>
    <!-- no "connection.pool_size" entry! -->

Erstellen Sie dann eine Datei "c3p0.properties", die sich im Stammverzeichnis des Klassenpfads befinden muss (d. H. Keine Möglichkeit, ihn für bestimmte Teile der Anwendung zu überschreiben):

c3p0.properties

c3p0.testConnectionOnCheckout = true

Wenn diese Lösung nicht funktioniert, gibt es mehr mögliche Lösungen: - 

1. Add

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

 Also dont forget to place the c3p0-0.9.1.jar in the classpath. 



    2. Instead of using that c3p0.properties file, couldn't you just use this property in your hibernate.cfg.xml:

<property name="hibernate.c3p0.validate">true</property>

    Also checkout the last post on this page:

    https://forum.hibernate.org/viewtopic.php?p=2399313

    If all these not work than go [more][1] and read in detail


  [1]: http://hibernatedb.blogspot.in/2009/05/automatic-reconnect-from-hibernate-to.html
0
Ravindra