最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Hibernate基于ThreadLocal管理Session過程解析

 更新時間:2020年10月26日 09:38:25   作者:Y_wee  
這篇文章主要介紹了Hibernate基于ThreadLocal管理Session過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

1、為什么要使用ThreadLocal管理Session

session是線程不安全的,因此在多線程環(huán)境下,session對象不能為共享對象

把Session寫成局部變量雖然可以解決線程安全問題,但是每次運(yùn)行都要打開及關(guān)閉session對象,導(dǎo)致性能受影響

如果直接調(diào)用調(diào)用sessionfactory.openSession方法,則無法在業(yè)務(wù)層獲取session對象

2、ThreadLocal管理Session的配置

2.1、方式一

通過自定義工具類實(shí)現(xiàn)

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();
    //創(chuàng)建工廠
    sessionFactory = cig.buildSessionFactory();
  }

  /**
   * 獲取Session對象
   */
  public static Session getSession(){
    //判斷threadlocal是否已經(jīng)存在當(dāng)前線程的Session,不存在才創(chuàng)建
    Session session=threadLocal.get();
    if (session==null){
      session=sessionFactory.openSession();
      threadLocal.set(session);
    }
    return session;
  }
  
  /**
   * 關(guān)閉session
   */
  public static void close() {
    Session session = threadLocal.get();
    if (session != null) {
      session.close();
    }
    threadLocal.set(null);
  }
}

2.2、方式二

通過hibernate.cfg.xml配置文件實(shí)現(xiàn)

在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();
    //創(chuàng)建工廠
    sessionFactory = cig.buildSessionFactory();
  }

  /**
   * 獲取Session對象
   */
  public static Session getSession(){
    return sessionFactory.getCurrentSession();
  }
}

3、備注

建議使用方式二,將threadlocal交給hibernate管理,不用自己關(guān)閉。

4、注意事項(xiàng)

當(dāng)使用工廠創(chuàng)建對象時,如果在工廠傳session,session不能定義為全局變量;因?yàn)槊總€線程都要有一個自己的session,建議在構(gòu)造方法調(diào)用工具類傳入session,不要在工廠傳session

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

怀远县| 麦盖提县| 平和县| 金堂县| 海安县| 南昌县| 密云县| 游戏| 巩留县| 卢龙县| 县级市| 玉龙| 拜城县| 宝鸡市| 东辽县| 梓潼县| 新巴尔虎右旗| 叶城县| 日照市| 九台市| 蒙自县| 靖州| 紫金县| 册亨县| 通渭县| 龙江县| 嘉善县| 南乐县| 朔州市| 孙吴县| 江都市| 无为县| 兰州市| 孝感市| 颍上县| 伊宁县| 太康县| 宣威市| 乐至县| 开化县| 信阳市|