zoukankan      html  css  js  c++  java
  • 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

    记得快乐
  • 相关阅读:
    2018-2019-2 20165316 《网络对抗技术》 Exp6 信息搜集与漏洞扫描
    2018-2019-2 网络对抗技术 20165316 Exp5 MSF基础应用
    2018-2019-2 网络对抗技术 20165316 Exp4 恶意代码分析
    2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践
    2018-2019-2 《网络对抗技术》Exp2 后门原理与实践
    2018-2019-2 20165316 《网络对抗技术》Exp1 PC平台逆向破解
    2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165316
    最近决定要重新回到博客了
    清华大学OS操作系统实验lab1练习知识点汇总
    基本数据结构学习总结: 二叉树的遍历
  • 原文地址:https://www.cnblogs.com/Y-wee/p/13808657.html
Copyright © 2011-2022 走看看