• 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

    记得快乐
  • 相关阅读:
    不高级不能发帖的WPS论坛
    打不开盖子的酸奶
    无意中发现的一个好设计:不浸水的香皂盒
    几件小事
    解决ios微信页面回退不刷新
    require.js
    前端遇到的坑
    gulp详细入门教程
    js 获取当前日期
    模仿微信朋友圈 图片浏览 h5 html5 js
  • 原文地址:https://www.cnblogs.com/Y-wee/p/13808657.html
Copyright © 2020-2023  润新知