[英]autowire hibernate session with spring 3 and hibernate 4
[英]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.