1. 程式人生 > 程式設計 >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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。