Hibernate mit c3p0 nutzen

Hibernate ICONHibernate ist eine Java-Bibliothek die zum object-relational-mapping genutzt wird. Ich benutze diese Bibliothek in einem kleinen Java-Projekt mit einer MySQL-Verbindung zum Server eines Webhosters. Bis vor einigen Wochen bin ich damit ganz gut durch gekommen. Dann wurde das Webhosting zu einem anderen Provider verlegt und ich bekam ständig Fehlermeldungen weil die Verbindung zum Server zusammenbrach.

Wie sich herausstellte ist beim neuen Provider der MySQL-Server anders konfiguriert, der Wert „wait_timeout“ ist hier auf 120 Sekunden gestellt. Sobald meine Hibernate-Verbindung also länger als 2 Minuten keine Aktion ausführt, wird die Verbindung abgebrochen und eine Exception geworfen. Wie kann man das nun am elegantesten verhindern?

Es gibt einen sehr einfachen Weg dieses Problem zu umgehen, dazu wird die c3p0-Biblithek genutzt die Hibernate praktischerweise gleich in die eigene JAR integriert hat. c3p0 dient dazu einen sogenannten Connection-Pool zu erstellen. Dieser Connection-Pool soll uns aber gar nicht weiter interessieren, wer mehr zu den Vorzügen eines Connection-Pools erfahren möchte kann dies hier tun.

Um c3p0 einzubinden können folgende beispielhafte Zeilen in der hypernate.cfg.xml ergänzt werden:

<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>

Der Vorteil von c3p0 liegt darin, dass es vor der nächsten Aktion einen Überprüfung der Verbindung durchführen kann. Dazu kann man die Konfigurationsvariable „testConnectionOnCheckout“ auf „true“ setzen.

<property name="c3p0.testConnectionOnCheckout">
    true
</property>

Diese Konfiguration ist allerdings sehr „teuer“ da vor jeder Transaktion die Verbindung getestet wird. Deshalb wird empfohlen statt dessen „idleConnectionTestPeriod“ zu nutzen, welches einen Verbindungstest nach x-Sekunden durchführt. Erweiterte Einstellungen sind mit „preferredTestQuery“ und „automaticTestTable“ möglich.

Da ich keine hochperformante Verbindung benötige hab ich mich vorerst nur für die testConnectionOnCheckout-Variante entschieden. Damit klappt es bis jetzt bestens.