• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Y-wee
博客园    首页    新随笔    联系   管理     

hibernate使用ThreadLocal管理Session

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<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

记得快乐
posted @ 2020-10-13 14:30  Y-wee  阅读(269)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3