Hibernate基于ThreadLocal管理Session過程解析
1、為什么要使用ThreadLocal管理Session
session是線程不安全的,因此在多線程環(huán)境下,session對象不能為共享對象
把Session寫成局部變量雖然可以解決線程安全問題,但是每次運行都要打開及關(guān)閉session對象,導致性能受影響
如果直接調(diào)用調(diào)用sessionfactory.openSession方法,則無法在業(yè)務(wù)層獲取session對象
2、ThreadLocal管理Session的配置
2.1、方式一
通過自定義工具類實現(xiàn)
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();
//創(chuàng)建工廠
sessionFactory = cig.buildSessionFactory();
}
/**
* 獲取Session對象
*/
public static Session getSession(){
//判斷threadlocal是否已經(jīng)存在當前線程的Session,不存在才創(chuàng)建
Session session=threadLocal.get();
if (session==null){
session=sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
/**
* 關(guān)閉session
*/
public static void close() {
Session session = threadLocal.get();
if (session != null) {
session.close();
}
threadLocal.set(null);
}
}
2.2、方式二
通過hibernate.cfg.xml配置文件實現(xiàn)
在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();
//創(chuàng)建工廠
sessionFactory = cig.buildSessionFactory();
}
/**
* 獲取Session對象
*/
public static Session getSession(){
return sessionFactory.getCurrentSession();
}
}
3、備注
建議使用方式二,將threadlocal交給hibernate管理,不用自己關(guān)閉。
4、注意事項
當使用工廠創(chuàng)建對象時,如果在工廠傳session,session不能定義為全局變量;因為每個線程都要有一個自己的session,建議在構(gòu)造方法調(diào)用工具類傳入session,不要在工廠傳session
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot和Redis實現(xiàn)Token權(quán)限認證的實例講解
這篇文章主要介紹了SpringBoot和Redis實現(xiàn)Token權(quán)限認證的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
什么是 Java 的 CyclicBarrier(代碼示例)
CyclicBarrier 是多線程協(xié)同的利器,適合需要多次同步的場景,本文通過代碼示例講解什么是 Java 的 CyclicBarrier,感興趣的朋友一起看看吧2025-03-03
mybatis逆向工程與分頁在springboot中的應(yīng)用及遇到坑
最近在項目中應(yīng)用到springboot與mybatis,在進行整合過程中遇到一些坑,在此將其整理出來,分享到腳本之家平臺供大家參考下2018-09-09
解讀SpringBoot接收List<Bean>參數(shù)問題(POST請求方式)
這篇文章主要介紹了解讀SpringBoot接收List<Bean>參數(shù)問題(POST請求方式),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
最新Spring?Security實戰(zhàn)教程之表單登錄定制到處理邏輯的深度改造(最新推薦)
本章節(jié)介紹了如何通過Spring Security實現(xiàn)從配置自定義登錄頁面、表單登錄處理邏輯的配置,并簡單模擬了前后分離的適配方案,本章節(jié)我們將Spring?Security?默認表單進行登錄定制到處理邏輯的深度改造,感興趣的朋友一起看看吧2025-03-03
Spring,hibernate,struts經(jīng)典面試筆試題(含答案)
這篇文章主要介紹了Spring,hibernate,struts經(jīng)典面試筆試題極其參考含答案,涉及SSH基本概念,原理與使用技巧,需要的朋友可以參考下2016-03-03
profiles.active多環(huán)境開發(fā)、測試、部署過程
這篇文章主要介紹了profiles.active多環(huán)境開發(fā)、測試、部署,主要講如何使用profiles.active這個變量,讓我們在開發(fā)過程快速切換環(huán)境配置,以及如何使一個部署適配各種不同的環(huán)境,需要的朋友可以參考下2023-03-03

