1. 程式人生 > >Hibernate中將session與本地執行緒繫結分析

Hibernate中將session與本地執行緒繫結分析

原文:https://blog.csdn.net/Marvel__Dead/article/details/61654297 

 

為什麼要把Session與本地執行緒繫結?

openSession():

總是建立一個新的session物件
你需要去明確的關閉session物件
在單執行緒環境它比getCurrentSession()更慢
你也不需要去配置任何屬性,你就能夠使用這個方法


getCurrentSession():

如果session不存在,它將建立一個新的session,否則在當前hibernate環境中使用同一個session
你不需要去關閉session物件,它將自動被hibernate內部機制關閉
在單執行緒環境它比opensession更快
你需要去配置中附加hibernate.current_session_context_class這個屬性,才能夠呼叫getCurrentSession()方法否則將會丟擲異常
所以在這裡openSession()和getCurrentSession()的主要區別就是快和慢的區別。
 

  • 我們每次通過openSession()開啟的session都是一次資料庫連線。

  • session類似於jdbc的connection,它的底層依賴於我們web階段學過的threadLocal

  • Hibernate已經幫我們實現了session與本地執行緒繫結

 

我們怎樣獲取與本地執行緒繫結的session:

首先在hibernate核心配置檔案中配置
呼叫sessionFactory裡面的方法得到
//在hibernate.cfg.xml中配置,也就是Hibernate核心配置檔案中。配置部位是在第二部分。

<property name="hibernate.current_session_context_class">thread</property>


//其中,上面的值一共有三個,但是我們一般只用thread,即Session物件與本地執行緒進行繫結。

- thread:Session物件的生命週期與本地執行緒繫結
- jta:Session物件的生命週期與JTA事務繫結
- managed:Hibernate委託程式來管理Session物件的生命週期