問題:在Hibernate中每次執行一次操做老是須要加載核心配置文件,獲取鏈接池等等都是重複動做,因此抽取出來session
解決:工具
package com.xxx.utils; /** *Hibernate的工具類 *@author cxh */ import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HiberUtils { // 1.建立一個session回話工廠,以單例模式管理(簡單的獲取session第一種) private static SessionFactory sessionFactory; // 2.ThreadLocal存儲session,一開始直接將session綁到當前線程,後面直接來獲取線程中的session(第二種) private static ThreadLocal<Session> currentSession = new ThreadLocal<Session>(); //初始化獲取session會話工廠 static { try { sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); } catch (HibernateException e){ e.printStackTrace(); throw new HibernateException("初始化會話工廠失敗"); } } // 獲取單例會話工廠 public static SessionFactory getSessionFactory() { return sessionFactory; } // 獲取session對象 public static Session openSession() { return sessionFactory.openSession(); } // 獲取綁定到線程裏面的session,若是獲取不到就建立一個新的線程去綁定session.這裏面要想session對象的生命週期與當前線程綁定,還須要在hibernate配置文件裏面配置current_session_context_class屬性,設置爲thread public Session getCurrentThreadSession() { // 獲取線程中的session Session s = currentSession.get(); if(s == null) { // 建立一個新的session s = sessionFactory.openSession(); // 將新的session與當前線程綁定 currentSession.set(s); } // 不爲空,當前線程有session,直接返回 return s; } // 關閉當前線程的session public static void closeCurrentThreadSession() { // 獲取當前線程綁定的session對象 Session s = currentSession.get(); // 當前線程有session對象,且該對象不爲空,須要關閉 if(s != null) { s.close(); } currentSession.set(null); } // 3.hibernate中底層已經幫你封裝了將session與當前線程綁定的方法 public static Session getCurrentSession() { return sessionFactory.getCurrentSession(); } //上面兩種獲取線程裏面的session均可以直接調用該封裝方法進行關閉 public static void closeSession() throws HibernateException { sessionFactory.getCurrentSession().close(); } }