簡體   English   中英

Spring + Hibernate會話生命周期

[英]Spring + Hibernate session lifecycle

應該如何正確地完成Spring下Hibernate會話的“生命周期”?

SessionFactory由Spring自動創建,並從Glassfish連接池獲取其數據庫連接。 目前我正通過SessionFactory.getCurrentSession()獲得Hibernate會話。 然后我開始事務,完成工作,然后在最后commit()rollback() 我是否需要隨時執行任何其他操作,如disconnect()close()flush()或任何其他操作,以便連接可以正確地返回到池中,或者Spring已經自動完成了所有操作?

有了很多這些方法,我現在有點困惑,要了解應該做什么,也許有人可以指向正確的方向?

由於SessionFactory是由Spring自動創建的,因此Spring框架將負責關閉連接。 查看Spring Resource Management

如果你想檢查。 如果您正在使用應用程序的日志記錄,則可以檢查日志。 它會像:

(主要)INFO [AnnotationSessionFactoryBean]關閉Hibernate SessionFactory

我從這個鏈接獲得以下行

這里的主要合同是創建Session實例。 通常,應用程序具有單個SessionFactory實例,服務客戶端請求的線程從此工廠獲取Session實例。 SessionFactory的內部狀態是不可變的。 創建后,將設置此內部狀態。 此內部狀態包括有關對象/關系映射的所有元數據。 實現者必須是線程安全的。

關於連接如何釋放回連接池的策略與Spring無關。它由Hibernate本身通過配置參數hibernate.connection.release_mode配置,該參數由org.hibernate.ConnectionReleaseMode中的枚舉標識。

從版本3.1+開始, hibernate.connection.release_mode的默認值為auto ,相應的ConnectionReleaseMode值取決於是使用JTA還是JDBC事務。 如果使用JDBC事務,則將其設置為ConnectionReleaseMode.AFTER_TRANSACTION (即after_transaction )。

ConnectionReleaseMode.AFTER_TRANSACTION的行為是:在每次事務之后,連接將返回到連接池,即通過調用transaction.commit()transaction.rollback() ,以及調用session.close()session.disconnect()

您可以在第11.5節的hibernate文檔中驗證此行為。

希望鏈接將指導您有關會話和交易的信息。

然后我開始事務,完成工作,然后在最后提交()或rollback()。 我是否需要隨時執行任何其他操作,如disconnect(),close(),flush()或任何其他操作,以便連接可以正確地返回到池中,或者Spring已經自動完成了所有操作?

當您在Transaction上調用commit()時,它將自動關閉會話,最終會在連接上調用close方法返回到它的池。

當您通過SessionFactory.getCurrentSession()執行hibernate查詢時,Spring執行打開和關閉連接的必要任務。 您在spring配置中使用的SessionFactory也在內部調用config.buildSessionFactory方法。

大多數情況發生在AbstractSessionFactoryBean的實現中。 連接的關閉是通過SessionFactoryImpl類中的hibernate使用語句settings.getConnectionProvider()。close();來完成的。 簡而言之,hibernate為您做了一切。 Spring會在必要時調用它的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM