1. 程式人生 > >hibernate本地執行緒與session繫結

hibernate本地執行緒與session繫結

         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的結果: