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

    记得快乐
  • 相关阅读:
    10 种保护 Spring Boot 应用的绝佳方法
    Redis 如何分析慢查询操作?
    Spring Boot 主类及目录结构介绍
    Redis 再牛逼,也得设置密码!!
    Spring Data Redis 详解及实战一文搞定
    Spring Boot Redis Cluster 实战干货
    超详细的 Redis Cluster 官方集群搭建指南
    Redis Linux 安装运行实战全记录
    hdu 4790 Just Random (思路+分类计算+数学)
    poj 1328 Radar Installation(贪心)
  • 原文地址:https://www.cnblogs.com/Y-wee/p/13808657.html
Copyright © 2011-2022 走看看