Hibernate中的Session管理和對話實現

1 管理Session對象

Session對象的管理方式:

  1. 應用程序序自主管理Session;
  2. Hibernate管理Session。

1.1 應用程序自主管理Session

應用程序自主管理Session對象的生命週期時,何時創建Session、何時清理緩存及何時關閉Session都有程序負責。

缺點:1)代碼重複;2)多個類共享同一個Session對象比較麻煩。

1.2 Hibernate管理Session

Hibernate管理Session的三種方式:

  • Session對象的生命週期與本地線程綁定(Hibernate負責將Session與本地線程綁定)
  • Session對象的生命週期與JTA事務綁定
  • Hibernate 委託程序管理Session對象的生命週期(也就是說,應用程序自主管理Session對象時,藉助於Hibernate將Session與本地線程綁定)

在Hibernate的配置文件Hibernate.cfg.xml中設置session的管理方式:

<property name="current_session_context_class">thread</property> //thread也可以換成jta或managed,分別對應三種管理方式;

  1 Session對象的生命週期與本地線程綁定

  • 創建Session:當一個線程調用SessionFactory的getCurrentSession()方法,而且此時沒有Session與當前線程綁定時,Hibernate自動創建Session對象
  • 關閉Session:當一個線程提交或撤銷事務後,Hibernate自動關閉Session對象。

    2 Session對象生命週期與JTA事務綁定

  • 創建Session:當一個線程調用SessionFactory的getCurrentSession()方法,而且此時沒有Session與當前JTA事務綁定時,Hibernate自動創建Session對象
  • 關閉Session:當一個線程提交或撤銷JTA事務後,Hibernate自動關閉Session對象。

Session對象與本地線程和與JTA事務綁定的區別:

前者是先有Session對象,然後由Session對象的beginTransaction()方法聲明一個事務;而後者是先通過UserTransaction接口聲明開始一個JTA事務,然後出現與該JTA綁定的Session對象。

    3  Hibernate委託程序管理Session對象

org.hibernate.context.ManagedSessionContext的靜態方法:

  • bind(Session session):把Session與當前線程綁定。
  • unbind(SessionFactory factory):解除Session對象與當前線程的綁定。
  • hasBind(SessionFactory factory):判斷是否存在與當前線程綁定的Session對象。

應用程序可以利用上面提供的方法來將session對象與當前線程綁定。

  • 創建Session :Session對象由程序決定何時創建,當程序創建Session對象後或者聲明開始一個事務前,利用bind()方法將Session與當前線程綁定。
  • 關閉Sesssion:程序決定何時關閉一個Session對象。當程序提交一個事務之前,調用unbind()方法,解除Session對象與當前線程的綁定。

2 實現對話

對話:包含了用戶思考時間的長工作單元。會話必須滿足:1. 數據一致性,即防止併發問題。2. 原子性。

對話的實現方式有三種:

  1. 整個對話對應一個事務,並且與一個Session對象對應。1:1:1
  2. 使用遊離對象:一個對話包括多個短事務,並且每個短事務對應一個單獨的Session對象。事務之間通過遊離對象傳遞業務數據。1:n:n
  3. 使用手工緩存模式下的Session對象:一個對話包含多個短事務,並且整個對話對應一個Session對象。1:n:1

三種實現對話方式比較如下圖所示:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章