Frage

Ich bin mit 3 überwintern mit c3p0 für ein Programm, das ständig Daten extrahiert aus einer Quelle und schreibt sie in einer Datenbank. Das Problem ist jetzt, dass die Datenbank aus irgendwelchen Gründen nicht mehr zur Verfügung könnten. (Im einfachsten Fall: ich einfach herunterfahren)

Wenn etwas im Begriff ist, in die Datenbank geschrieben werden, da keine Ausnahme sein sollte - die Abfrage für alle Ewigkeit warten sollte, bis die Datenbank wieder verfügbar wird. Wenn ich mich nicht irre ist dies eines der Dinge, der Connection-Pool für mich tun könnte. Wenn es ein Problem mit dem db ist, nur eine Verbindung wiederholen - im schlimmsten Fall für die Unendlichkeit

Aber stattdessen bekomme ich eine gebrochenes Rohr Ausnahme, gefolgt manchmal durch Verbindung abgelehnt und dann wird die Ausnahme zu meinem eigenen Code übergeben, was passieren soll, nicht.

Auch wenn ich die Ausnahme abfangen, wie könnte ich überwintern sauber neu initialisieren wieder? (Bisher ohne c3p0 i gebaut einfach die Sitzung Fabrik wieder, aber ich wäre nicht überrascht, wenn die Verbindungen austreten kann (oder ist es in Ordnung, dies zu tun?)).

Die Datenbank ist Virtuoso Open-Source-Ausgabe.

Meine hibernate.xml.cfg c3p0 config:

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>  
<property name="hibernate.c3p0.breakAfterAcquireFailure">false</property>
<property name="hibernate.c3p0.acquireRetryAttempts">-1</property>
<property name="hibernate.c3p0.acquireRetryDelay">30000</property>
<property name="hibernate.c3p0.automaticTestTable">my_test_table</property>

<property name="hibernate.c3p0.initialPoolSize">3</property>
<property name="hibernate.c3p0.minPoolSize">3</property>
<property name="hibernate.c3p0.maxPoolSize">10</property>

btw: Die Test-Tabelle wird erstellt und ich bekomme jede Menge Debug-Output- so es sie tatsächlich liest die Config scheint

.
War es hilfreich?

Lösung

Nun, es scheint, dass BoneCP dies tatsächlich umgesetzt hat. Es kann die Transaktion aufzeichnen und wiedergeben es auf dem Netzwerk oder Datenbankfehler festgelegt werden:

http: // jolbox.com/bonecp/downloads/site/apidocs/com/jolbox/bonecp/BoneCPConfig.html#setTransactionRecoveryEnabled(boolean)

Andere Tipps

  

Wenn ich mich nicht irre dies eines der Dinge, ist der Verbindungspool für mich tun könnte. Wenn es ein Problem mit dem db ist, nur eine Verbindung wiederholen - im schlimmsten Fall für die Unendlichkeit

Sie sind falsch. Ein Verbindungspool ist nur ... ein Connection-Pool, enthält es einige bereits etablierte physikalische Verbindungen zur Datenbank und verwendet wird, um den Aufwand für die Erstellung dieser Verbindungen zu vermeiden, wenn Sie einen von ihnen benötigen.

Das heißt, können diese Verbindungen veralten (z, wenn Sie die Datenbank neu starten). Glücklicherweise können die meisten Verbindungspools konfiguriert werden, zu testen, ob eine Verbindung noch gültig ist und sie zu erneuern, bevor sie zu verteilen. c3p0 unterstützen diese Funktion wie dokumentiert in Konfigurieren von Verbindungstest und Sie sind eigentlich schon eine der verschiedenen Optionen. So sollten Sie Ihre Verbindungen erneuert werden, wenn die Datenbank zurückkommt.

Aber nicht erwarten, dass Ihre Anwendung auf magische Weise ausgesetzt werden, wenn die Datenbank ausfällt, ein Pool wird dies nicht tun.

Vielen Dank für die Antwort. Es scheint, ich habe gerade nicht wirklich den letzten Absatz des Abschnitts verstanden http://www.mchange.com/projects/c3p0/index.html# configuring_recovery

Da zunächst scheint es c3p0 konnte es (abgestanden Verbindungen erkennen und versuchen Sie es erneut Verbindungen in alle Ewigkeit zu erwerben, ohne jemals eine Ausnahme vom Anwendungscode zu werfen (es sei denn natürlich, wenn sein ein Fehler an die SQL-Anweisung und nicht auf die Verbindung), aber im letzten Absatz -, die in ziemlich verwirrend Art und Weise geschrieben -. es scheint, als ob c3p0 nicht, dass% bis 100 gewährleistet

Also meine Lösung ein kleines Wrapper für die Methoden zu machen, war ich von der JDBC-Verbindung Schnittstelle benötigt, die, wenn eine Abfrage zu verbinden versuchen, nicht aufgrund eines Verbindungsfehler. Natürlich ist es ein wenig hacky, weil ich eher würde meine Komponenten verwenden, anstatt meiner eigenen Schnittstelle haben die Standard-Anschluss-Schnittstelle, aber zumindest sauber jetzt seine Arbeit.

Sie vergessen:

  • Was über Ihre Transaktionen, die gestartet wurden?
  • Was über alle PreparedStatements, die bereits an die DB gesendet wurden?
  • etc

Ihre Bewerbung wird deshalb hat die Transaktion neu zu starten. Die einzige Möglichkeit, die ich denken kann ist, dass der Verbindungspool Spur eines jeden Aufrufs an den Verbindungspunkt zu halten und diejenigen im Fehlerfall wiederholen, aber dies stark die Verbindung Pool verlangsamen würde.

Im Fall von BoneCP ( http://jolbox.com ), erkennt der Pool ein Fehler aufgetreten ist, durch fängt die von den JDBC-Treiber geworfen Ausnahme ersten und es entweder durch Handhabung, diese Verbindung als fehlerhaft oder aber das Markieren durch den gesamten Verbindungspool neu zu erstellen.

Edit: Es wird jetzt behandelt

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top