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

    记得快乐
  • 相关阅读:
    面向对象
    Spring学习(十四)----- Spring Auto Scanning Components —— 自动扫描组件
    Spring学习(十三)-----Spring 表达式语言(Spring EL)
    Spring学习(十二)-----Spring @PostConstruct和@PreDestroy实例
    Spring学习(十二)-----Spring Bean init-method 和 destroy-method实例
    学习计划
    Spring学习(十一)-----Spring使用@Required注解依赖检查
    Spring学习(十)-----Spring依赖检查
    Spring学习(九)-----Spring bean配置继承
    Spring学习(八)-----Spring注入值到集合类型的例子
  • 原文地址:https://www.cnblogs.com/Y-wee/p/13808657.html
Copyright © 2011-2022 走看看