Hibernate基於ThreadLocal管理Session過程解析
阿新 • • 發佈:2020-10-26
1、為什麼要使用ThreadLocal管理Session
session是執行緒不安全的,因此在多執行緒環境下,session物件不能為共享物件
把Session寫成區域性變數雖然可以解決執行緒安全問題,但是每次執行都要開啟及關閉session物件,導致效能受影響
如果直接呼叫呼叫sessionfactory.openSession方法,則無法在業務層獲取session物件
2、ThreadLocal管理Session的配置
2.1、方式一
通過自定義工具類實現
package com.yl.utils; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /** * hibernate工具類 */ public class HibernateUtils { private static SessionFactory sessionFactory; private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>(); static { //載入配置檔案 Configuration cig = new Configuration().configure(); //建立工廠 sessionFactory = cig.buildSessionFactory(); } /** * 獲取Session物件 */ public static Session getSession(){ //判斷threadlocal是否已經存在當前執行緒的Session,不存在才建立 Session session=threadLocal.get(); if (session==null){ session=sessionFactory.openSession(); threadLocal.set(session); } return session; } /** * 關閉session */ public static void close() { Session session = threadLocal.get(); if (session != null) { session.close(); } threadLocal.set(null); } }
2.2、方式二
通過hibernate.cfg.xml配置檔案實現
在hibernate.cfg.xml中加入配置
<property name="hibernate.current_session_context_class">thread</property>
修改hibernate工具類程式碼
package com.yl.utils; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /** * hibernate工具類 */ public class HibernateUtils { private static SessionFactory sessionFactory; static { //載入配置檔案 Configuration cig = new Configuration().configure(); //建立工廠 sessionFactory = cig.buildSessionFactory(); } /** * 獲取Session物件 */ public static Session getSession(){ return sessionFactory.getCurrentSession(); } }
3、備註
建議使用方式二,將threadlocal交給hibernate管理,不用自己關閉。
4、注意事項
當使用工廠建立物件時,如果在工廠傳session,session不能定義為全域性變數;因為每個執行緒都要有一個自己的session,建議在構造方法呼叫工具類傳入session,不要在工廠傳session
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。