Die Umstellung einer Anwendung von Hibernate Version 3.2 auf Version 3.3 ist weniger trivial als zu vermuten wäre. Ein einfaches Austauschen des hibernate3.jar führt hier nicht zum Erfolg sondern endet in einer Reihe von Fehlermeldungen.
Ab Version 3.3 benötigt Hibernate zusätzliche Bibliotheken, da z.B. das Logging auf SLF4J umgestellt wurde. Hier eine kurze Übersicht der zusätzlich nötigen JAR Dateien und welche konkret auf unserem System zum Einsatz kommen:
- commons-collection ab Version 3.1 : commons-collection-3.2.jar
- slf4j-api : slf4j-api-1.5.5.jar
- slf4j Adapter für log4j: slf4j-log4j12-1.5.5.jar
Nachdem die Anwendung nun fehlerfrei startete, dachte man. alles sei in Ordnung. Doch nach einigen Stunden meldete die Überwachung Fehler beim Zugriff auf die Datenbank:
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was100413 seconds ago.The last packet sent successfully to the server was 100413 seconds ago, which is longer than the server configured value of ‘wait_timeout’. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property ‘autoReconnect=true’ to avoid this problem.
Nach einiger Suche stellte sich heraus, dass Hibernate gar nicht, wie gewünscht, für das Connection Pooling C3P0 verwendetet sondern seinen eigenen, rudimentären Connection Pool. Die hibernate.cfg.xml enthielt aber alle nötigen hibernate.c3p0 Properties weshalb die Ursache nicht offensichtlich war. Des Rätsels Lösung liegt in der ab Version 3.3 nötigen expliziten Angabe der ConnectionProviderClass. Mit Hilfe der Property hibernate.connection.provider_class lässt sich diese angeben. Folgender Eintrag muss also in der hibernate.cfg.xml hinzugefügt werden um C3P0 als Connection Pool zu verwenden:
<property name="hibernate.connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>
Nun verwendet Hibernate auch wieder C3P0 und die Anwendung läuft seitdem ohne Probleme.
Viel Spaß und Erfolg beim Ausprobieren und Anwenden.