1 管理Session對象
Session對象的管理方式:
- 應用程序序自主管理Session;
- 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. 原子性。
對話的實現方式有三種:
- 整個對話對應一個事務,並且與一個Session對象對應。1:1:1
- 使用遊離對象:一個對話包括多個短事務,並且每個短事務對應一個單獨的Session對象。事務之間通過遊離對象傳遞業務數據。1:n:n
- 使用手工緩存模式下的Session對象:一個對話包含多個短事務,並且整個對話對應一個Session對象。1:n:1
三種實現對話方式比較如下圖所示: