6 Stimmen

Hibernate löst keine Ausnahme aus, wenn openSession aufgerufen wird und die Verbindung zur DB nicht hergestellt werden kann

Wenn ich hibernate konfiguriere, um eine Verbindung zu einer DB herzustellen, und die Verbindung aus irgendeinem Grund fehlschlägt, habe ich bemerkt, dass es keine Ausnahme auslöst, weder beim Aufbau der Fabrik (was akzeptabel ist) noch beim Aufruf von sessionFactory.openSession() (was weniger akzeptabel ist). Was noch ärgerlicher ist, ist dass session.isConnected() true zurückgibt, nachdem ich sessionFactory.openSession() aufgerufen habe. (Was völlig inakzeptabel ist).

Der einzige Hinweis bis zu diesem Moment, der mir sagt, dass es nicht mit der DB verbunden ist, ist ein WARN-Protokolleintrag, der durch eine java.sql.SQLException verursacht wird, die er intern abfängt und einfach an den Logger sendet. Gibt es außer dem Erstellen einer Pseudotransaktion, um eine Ausnahme zu erzwingen, noch eine andere Möglichkeit, den Verbindungsstatus zu ermitteln? (Vielleicht eine Option in der Konfiguration, die besagt, dass der fehlgeschlagene Verbindungsversuch nicht protokolliert wird, sondern eine Hibernate-Ausnahme ausgelöst wird). Ich habe gesucht, aber nichts gefunden. Vielen Dank!

3voto

ChssPly76 Punkte 97241

Welchen Verbindungspool verwenden Sie? Den integrierten Pool von Hibernate sollte nicht verwendet werden für etwas anderes als einfache Tests.

Proxool können Sie hingegen genau das tun, was Sie wollen: Sie können test-before-use Eigenschaft auf true setzen und eine Ausnahme auslösen, wenn keine geeignete Verbindung gefunden oder erstellt werden kann. Sie können sogar auf Verbindungsereignisse hören wenn Sie wollen.

3voto

aperkins Punkte 12484

Wie ChssPly erwähnt, sollten Sie den in Hibernate eingebauten Pool für so gut wie nichts verwenden. Eine weitere Option neben Proxool (das ich persönlich nicht verwendet habe, so dass ich mich nicht persönlich dafür verbürgen kann) ist C3P0 . Beim Einrichten des Verbindungspools kommt es definitiv zu einer Ausnahme - dafür KANN ich mich verbürgen :) Da dies das Verhalten ist, das ich mit unserer Anwendung möchte, funktioniert es perfekt für uns.

0voto

Paralife Punkte 5936

Entschuldigen Sie, dass ich das Thema erneut anspreche, aber: Ich habe C3p0 ausprobiert und es ist besser als das eingebaute, aber was mein Problem angeht, macht es absolut nichts anderes als Vanilla Hibernate: Wenn es keine Verbindung herstellen kann, wirft es eine Ausnahme, Hibernate fängt diese Ausnahme ab und versteckt sie wiederum vor mir. Wenn ich c3p0 verwende, benutze ich immer noch die Hibernate-API, und was auch immer c3p0 auslöst, wird von Hibernate abgefangen. Der einzige Weg, den ich dachte, ist die programmatische Instanziierung der c3p0-Datenquelle, und wenn keine Ausnahme ausgelöst wird (die ich abfangen kann), dann übergebe ich sie an Hibernate. Aber dann erkannte ich, dass eine DataSource an Hibernate zu übergeben, können Sie nur durch JNDI-URL zu tun, und dies ist keine Option. Also meine letzte Hoffnung ist, benutzerdefinierte Connection Provider zu implementieren, verwenden Sie c3p0 innerhalb und fangen c3p0 Ausnahme in dort. Gibt es eine andere Alternative?

Beachten Sie, dass ich proxool nicht ausprobiert habe, weil es schwierig zu sein scheint, es mit Hibernate zu konfigurieren, obwohl ich es selbst nicht ausprobiert habe. Auch sorry für die Zuweisung einer Antwort vor gründlich zu testen.

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