hibernate本地執行緒與session繫結
阿新 • • 發佈:2018-11-09
hibernate本地執行緒與session繫結:一個專案完成後可能有多個人同時操作,無法保證session是一個唯一的物件。若要保證session是唯一的物件,就要將session與本地執行緒繫結。
在overstackoverflow中有這樣的說法:
大概的意思是:使用openSession()的話,
- 總是建立一個新的session物件
- 你需要去明確的關閉session物件
- 在單執行緒環境它比getCurrentSession()更慢
- 你也不需要去配置任何屬性,你就能夠使用這個方法
如果你使用的是getCurrentSession()方法獲取session的話,
- 如果session不存在,它將建立一個新的session,否則在當前hibernate環境中使用同一個session
- 你不需要去關閉session物件,它將自動被hibernate內部機制關閉
- 在單執行緒環境它比opensession更快
- 你需要去配置中附加hibernate.current_session_context_class這個屬性,才能夠呼叫getCurrentSession()方法否則將會丟擲異常
我們怎樣獲取與本地執行緒繫結的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物件的生命週期
然後我們呼叫sessionFactory裡面的方法得到:
但是我們一般是把獲取本地執行緒session的程式碼放在utils中:
public class HibernateUtils {
private static SessionFactory sessionFactory=null;
static{
Configuration configuration=new Configuration();
configuration.configure();
sessionFactory=configuration.buildSessionFactory();
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
public static Session getCurrentSession(){//在工具類裡面獲取與本地執行緒繫結的session。
return sessionFactory.getCurrentSession();
}
}
@Test
public void showLocalSession(){
Transaction transaction=null;
Session session=null;
try {
session=HibernateUtils.getCurrentSession();
transaction=session.beginTransaction();
Book book=new Book("《ACM入門訓練指南》", 99);
session.save(book);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}
}
//不知道各位朋友是否發現了,我在上面的演示中並沒有寫關閉session的程式碼。
//其實通過單元測試工具就會知道,當我們在finaly裡面寫上關閉session的操作會顯示session已經關閉。
//因為我們這裡的session是綁定了本地執行緒的session,當本地執行緒被關閉後,session也就自然而然的被關閉了。就像是同一根繩子上面的螞蚱。這樣也就不用我們去關閉session了。
注意:綁定了本地執行緒的session是不用我們自己去關閉的!!!如果我們的sesson是沒有與本地執行緒繫結的,是通過sessionFactory.openSession()獲取的,那麼就要我們自己手動進行關閉
如果在finaly中關閉session的結果: