14 Stimmen

Hibernate session.close() gibt die Verbindung nicht an den Pool zurück

Meine Anwendung hat lang laufende Transaktionen und deshalb habe ich die Option session.close() am Ende jeder Methode ausprobiert, um sicherzustellen, dass die Verbindungsobjekte nicht unbegrenzt lange gehalten werden.

Wenn die Option session.close() verwendet wird, konnte ich sehen, dass das Hibernate-Sitzungsobjekt und das entsprechende Verbindungsobjekt, das von session.connection() erhalten wurde, ordnungsgemäß zerstört werden. Aber das Problem liegt beim Verbindungspool. Die Verbindung, die von der Sitzung erhalten wurde, wird auch nach dem Schließen der Sitzung nicht an den Verbindungspool zurückgegeben. Andere Anfragen warten auf eine Verbindung aus dem Pool.

Ich verwende in meiner Anwendung JTA-Transaktionen. In der hibernate.cfg.xml habe ich die connection.release_mode auf auto (Standard) und connection.autocommit auf true gesetzt.

Hat jemand dieses Problem gehabt? Bitte lassen Sie mich wissen, was ich hier übersehe.

Nachfrage: Dies sind die Details meiner Hibernate-Konfigurationsdatei:

MXoraDS
org.hibernate.dialect.Oracle9Dialect
after_statement
org.hibernate.transaction.WeblogicTransactionManagerLookup
org.hibernate.transaction.JTATransactionFactory
org.hibernate.context.JTASessionContext
true
2

Wir verwenden JSF und EJB 2.1 auf der Anwendungsebene, die eine Verbindung zur Oracle-Datenbank herstellen. Das after_statement scheint die Verbindung zum Pool nicht freizugeben. Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

20voto

Pascal Thivent Punkte 548176

Ich verwende JTA-Transaktionen in meiner Anwendung. In hibernate.cfg.xml habe ich connection.release_mode auf auto (Standard) und connection.autocommit auf true gesetzt.

Könnten Sie versuchen, die hibernate.connection.release_mode-Eigenschaft explizit auf after_statement zu definieren? Ich weiß, dass dies standardmäßig so sein soll, aber je nach Kontext (verwenden Sie vielleicht Spring?), könnte auto sich anders verhalten als erwartet (siehe hier und hier).

Zur Referenz, hier ist was die Tabelle 3.4. Hibernate JDBC und Connection Properties über die Eigenschaft hibernate.connection.release_mode sagt:

Legt fest, wann Hibernate JDBC-Verbindungen freigeben sollte. Standardmäßig wird eine JDBC-Verbindung gehalten, bis die Sitzung explizit geschlossen oder getrennt wird. Für eine Anwendungs-Server JTA-Datenquelle, verwenden Sie after_statement um Verbindungen aggressiv nach jedem JDBC-Aufruf freizugeben. Für eine Non-JTA-Verbindung macht es oft Sinn, die Verbindung am Ende jeder Transaktion freizugeben, indem Sie after_transaction verwenden. auto wählt after_statement für die JTA- und CMT-Transaktionsstrategien und after_transaction für die JDBC-Transaktionsstrategie.

z.B. auto (default) | on_close | after_transaction | after_statement

Diese Einstellung betrifft nur Sitzungen, die von SessionFactory.openSession zurückgegeben werden. Für Sitzungen, die über SessionFactory.getCurrentSession erhalten werden, steuert die konfigurierte CurrentSessionContext-Implementierung den Verbindungs-Freigabemodus für diese Sitzungen. Siehe Abschnitt 2.5, "Kontextbezogene Sitzungen"

Wenn es nicht hilft, fügen Sie bitte weitere Details zu Ihrer Umgebung und Konfiguration (Spring?), wie Sie die Sitzung erhalten usw., hinzu.

0voto

Salandur Punkte 6351

Wenn Sie den JDBCTransactionManager verwenden, wird die Verbindung am Ende der Transaktion an den Verbindungspool zurückgegeben.

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