6 Stimmen

Hibernate-Verbindung wiederherstellen

Kennt jemand eine Möglichkeit, die Verbindung zum Ruhezustand wiederherzustellen/erneut zu versuchen? Ich meine zum Beispiel: die Remote-DB ist ausgefallen und ich starte meine Anwendung. Hibernate ist nicht in der Lage, eine Verbindung herzustellen, es schlägt fehl. Aber die Anwendung wird nicht geschlossen. Gibt es eine Möglichkeit, Hibernate anzuweisen, noch einmal zu versuchen, eine Verbindung herzustellen?

Vielen Dank im Voraus

19voto

Spajus Punkte 7188

Sie sollten sich wirklich für C3P0-Verbindungspooling entscheiden: http://www.mchange.com/projects/c3p0/index.html#hibernate-specific

In der C3P0-Dokumentation gibt es einen Abschnitt zu diesem Thema: http://www.mchange.com/projects/c3p0/index.html#configuring_recovery

Zuerst müssen Sie c3p0 richtig konfigurieren, was im Falle der Verwendung von hibernate in der Datei c3p0.properties geschehen muss.

Legen Sie in der Datei c3p0.properties diese Eigenschaften fest, damit bei einem Ausfall der Datenbank alle 3 Sekunden ein neuer Verbindungsversuch unternommen wird:

c3p0.acquireRetryAttempts = 0
c3p0.acquireRetryDelay = 3000
c3p0.breakAfterAcquireFailure = false

Um zu vermeiden, dass abgebrochene Verbindungen auf unbestimmte Zeit in Ihrem Pool verbleiben, sollten Sie außerdem die Verwaltung des Verbindungsalters verwenden:

c3p0.maxConnectionAge = 6000
c3p0.maxIdleTime = 6000
c3p0.maxIdleTimeExcessConnections = 1800
c3p0.idleConnectionTestPeriod = 3600

Diese sind zwar recht teuer, aber hilfreich, wenn die oben genannten Maßnahmen nicht ausreichen:

c3p0.testConnectionOnCheckout = true
c3p0.preferredTestQuery = SELECT 1;

Sie sollten auch prüfen, ob es Verbindungslecks gibt, die eine Wiederherstellung verhindern:

c3p0.debugUnreturnedConnectionStackTraces = true

Vergewissern Sie sich schließlich, dass C3P0 korrekt mit Hibernate verbunden ist, aktivieren Sie die Debug-Protokollierung für das Paket "com.mchange" und sehen Sie nach, ob C3P0 Ihnen etwas über sich selbst mitteilt. Es sollte die Konfigurationseigenschaften angeben, die geladen werden, also sehen Sie nach, ob alles vorhanden ist.

Ich hoffe, das hilft.

1voto

Nayan Wadekar Punkte 11136

C3P0 ist die interne Implementierung des Verbindungspools für Hibernate.

Hinzufügen von "hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider" in die Hibernate-Eigenschaftendatei ein. Erstellen Sie eine Datei c3p0.properties und setzen Sie die Parameter entsprechend. Diese Datei und c3p0-x.jar müssen sich im Klassenpfad befinden.

c3p0.properties

  • c3p0.idleConnectionTestPeriod : Wenn dies eine Zahl größer als 0 ist, testet c3p0 alle inaktiven, gepoolten, aber nicht ausgecheckten Verbindungen alle diese Anzahl von Sekunden.

  • c3p0.testConnectionOnCheckout : Nur bei Bedarf verwenden. Teuer. Wenn true, wird bei jedem Checkout einer Verbindung eine Operation durchgeführt, um zu überprüfen, ob die Verbindung gültig ist. Bessere Wahl: Überprüfen Sie die Verbindungen regelmäßig mit idleConnectionTestPeriod.

Es gibt mehrere andere Eigenschaften, die in hibernate.properties & c3p0.properties konfiguriert werden können.

0voto

Oleg Poltoratskii Punkte 478

Möglicherweise versuchen Sie, die Methode .getCurrentSession() stattdessen .openSession() ?

Wenn die Verbindung abbricht, müssen Sie eine neue herstellen.

Ich hoffe, das hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X