Hibernate基于ThreadLocal管理Session過程解析
1、為什么要使用ThreadLocal管理Session
session是線程不安全的,因此在多線程環(huán)境下,session對(duì)象不能為共享對(duì)象
把Session寫成局部變量雖然可以解決線程安全問題,但是每次運(yùn)行都要打開及關(guān)閉session對(duì)象,導(dǎo)致性能受影響
如果直接調(diào)用調(diào)用sessionfactory.openSession方法,則無法在業(yè)務(wù)層獲取session對(duì)象
2、ThreadLocal管理Session的配置
2.1、方式一
通過自定義工具類實(shí)現(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對(duì)象 */ public static Session getSession(){ //判斷threadlocal是否已經(jīng)存在當(dā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配置文件實(shí)現(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對(duì)象 */ public static Session getSession(){ return sessionFactory.getCurrentSession(); } }
3、備注
建議使用方式二,將threadlocal交給hibernate管理,不用自己關(guān)閉。
4、注意事項(xiàng)
當(dāng)使用工廠創(chuàng)建對(duì)象時(shí),如果在工廠傳session,session不能定義為全局變量;因?yàn)槊總€(gè)線程都要有一個(gè)自己的session,建議在構(gòu)造方法調(diào)用工具類傳入session,不要在工廠傳session
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Hibernate雙向一對(duì)一映射關(guān)系配置代碼實(shí)例
- Hibernate雙向多對(duì)多映射關(guān)系配置代碼實(shí)例
- 淺談hibernate中懶加載禁用操作
- 解決spring boot hibernate 懶加載的問題
- springboot 2.3之后消失的hibernate-validator解決方法
- Idea+maven搭建SSH(struts2+hibernate5+spring5)環(huán)境的方法步驟
- Spring+SpringMVC+Hibernate整合實(shí)例講解
- Hibernate傳入Java對(duì)象創(chuàng)建動(dòng)態(tài)表并錄入數(shù)據(jù)
相關(guān)文章
Java BufferedImage轉(zhuǎn)換為MultipartFile方式
這篇文章主要介紹了Java BufferedImage轉(zhuǎn)換為MultipartFile方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Spring Boot Feign服務(wù)調(diào)用之間帶token問題
這篇文章主要介紹了Spring Boot Feign服務(wù)調(diào)用之間帶token的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09MyBatis中的XML實(shí)現(xiàn)和動(dòng)態(tài)SQL實(shí)現(xiàn)示例詳解
這篇文章主要介紹了MyBatis中的XML實(shí)現(xiàn)和動(dòng)態(tài)SQL實(shí)現(xiàn),我們可以將XML中重復(fù)出現(xiàn)的內(nèi)容提取出來放到sql標(biāo)簽中,當(dāng)需要用到sql標(biāo)簽中的內(nèi)容時(shí),用include標(biāo)簽將sql標(biāo)簽中的內(nèi)容引進(jìn)來即可,感興趣的朋友跟隨小編一起看看吧2024-02-02淺析Spring配置中的classpath:與classpath*:的區(qū)別
這篇文章主要介紹了Spring配置中的"classpath:"與"classpath*:"的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Spring、SpringMVC和SpringBoot的區(qū)別及說明
這篇文章主要介紹了Spring、SpringMVC和SpringBoot的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-10-10SpringCloud Bus如何實(shí)現(xiàn)配置刷新
這篇文章主要介紹了SpringCloud Bus如何實(shí)現(xiàn)配置刷新,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Java8中LocalDateTime與時(shí)間戳timestamp的互相轉(zhuǎn)換
這篇文章主要給大家介紹了關(guān)于Java8中LocalDateTime與時(shí)間戳timestamp的互相轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03