Hibernate Verbindungstest

RealHAZZARD

Erfahrenes Mitglied
Servus,

ich verwende Hibernate für mein kleines Projekt. Es gibt eigentlich auch keine Besonderheiten daran.
Ich würde innerhalb meines Programms von Zeit zu Zeit abfragen wollen, ob die Verbindung noch intakt ist.
Leider macht es nicht viel Sinn im Standardverhalten von Hibernate die Methoden session.isClosed() oder session.isConnected() aufzurufen. Diese liefern immer true zurück.
Allerdings bin ich bereit zu glauben, dass man diese Methoden nicht aus Langeweile erstellt hat. Ich denke mir, dass es vielleicht nur eine Einstellungssache ist. Nur leider fehlt mir die Kenntniss. Ich habe keine Ahnung wie diese Option heißt. Ich dachte, dass es vieleicht die Eigenschaft "testonborrow" ist, nur leider brachte das keinen Erfolg. Kann mit einer helfen?
Hier meine config:
XML:
                                                                                                                                <hibernate-configuration>
    <session-factory>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">***</property>
        <property name="connection.username">***</property>
        <property name="connection.password">***</property>
        <!--<property name="hibernate.show_sql">
true</property> -->
        <property name="connection.autocommit">true</property>
        <property name="testOnBorrow">true</property>
        <mapping class="chronos.persistence.entities.Booking"/>
        <mapping class="chronos.persistence.entities.Card"/>
        <mapping class="chronos.persistence.entities.CardHistory"/>
      </session-factory> 
</hibernate-configuration>
 
Zuletzt bearbeitet von einem Moderator:
Eine Session ist etwas anderes als eine Verbindung. Desweiteren hoffe ich, dass du die Session nicht über die ganze Applikationszeit aufrecht erhältst. D.h was du effektiv machen kannst, istr schauen, ob du gerade eben eine Verbindung aufbauen kannst (und dann annehmen, dass Hibernate das auch kann). Im Normalfall reicht ein manueller SELECT auf irgendeine bekannte Tabelle via plain JDBC.

Gruß
Ollie
 
Unwissend wie ich bin, habe ich schon versucht diese eine Session die ganze Zeit über aufrecht zu erhalten. Ich hole mir die Session wie folgt:
java Code:
SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();

session = sf.openSession();



Und das einzige, das ich bisher wirklich damit mache ist:
java Code:
session.save(myObject);




Dein Vorschlag zur Überwachung ist schon eine gute Alternative, aber eigentlich möchte ich ja wissen, ob Hibernate selbst eine Verbindung zu DB hinbekommt und halten kann.OK das mit dem Testobject laden lassen klingt auch gut (und das werde ich auch machen, wenn sich nicht noch eine bessere Lösung anbietet)

PS: Ich bin gern bereit das mit der dauerhaften Session zu ändern, aber ich bin halt einer der es immer genau wissen will. Kannst Du mir also sagen, was daran verwerflich ist?
 
Eine Session ist, wie der Name schon sagt, ein "Arbeitszyklus" von Hibernate. D.h. alles, was darn passiert, bleibt solange im Speicher bis jemand die Session schließt. Wenn du die jetzt die ganze Zeit offen hältst, hast du nach ner gewissen Zeit die komplette DB im Speicher -> ungut. Desweiteren gehen die dirtyread checks über alle Objekte in der Session was bedeutet, dass die mit zunehmender Größe immmer langsamer werden...

Im Idealfall konfiguriert man sich eine DataSource und lässt Hibernate mit der arbeiten. Das hat den Vorteil, dass man auch an Hibernate vorbei recht leicht die DB pingen kann.

Gruß
Ollie
 
Zurück