Hibernate基于ThreadLocal管理Session过程解析

网友投稿 280 2022-11-16


Hibernate基于ThreadLocal管理Session过程解析

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 threadLocal=new ThreadLocal();

static {

//加载配置文件

Configuration cig = new Configuration().configure();

//创建工厂

sessionFactory = cig.buildSessionFactory();

}

/**

* 获取Session对象

*/

public static Session getSession(){

EGigyNy //判断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中加入配置

thread

修改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 sessihttp://onFactory.getCurrentSession();

}

}

3、备注

建议使用方式二,将threadlocal交给hibernate管理,不用自己关闭。

4、注意事项

当使用工厂创建对象时,如果在工厂传session,session不能定义为全局变量;因为每个线程都要有一个自己的session,建议在构造方法调用工具类传入session,不要在工厂传session


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Springmvc数据格式化原理及代码案例
下一篇:Spring Boot 使用 Swagger 构建 RestAPI 接口文档
相关文章

 发表评论

暂时没有评论,来抢沙发吧~