1. 程式人生 > >通過ThreadLocal實現每條執行緒都有屬於自己的一個session例項

通過ThreadLocal實現每條執行緒都有屬於自己的一個session例項

為什麼使用TreadLocal來實現?
當使用ThreadLocal維護變數時,ThreadLocal為每個使用該變數的執行緒提供獨立的變數副本,所以每一個執行緒都可以獨立地改變自己的副本,而不會影響其它執行緒所對應的副本。
具體實現如下:
建立類 SessionUtil.java

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class SessionUtil {
    private static SessionFactory factory;
    private
static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); // 靜態初始化塊,載入配置資訊,獲取SessionFactory static { // 讀取hibernate.cfg.xml檔案 Configuration cfg = new Configuration().configure(); // 建立SessionFactory factory = cfg.buildSessionFactory(); } public
static Session getSession() { //獲取當前執行緒下的session Session session = threadLocal.get(); //如果session為null,則從SessionFactory中獲取一個session放入ThreadLocal if(session==null) { System.out.println("session is null!"); session = factory.openSession(); threadLocal.set
(session); } return session; } public static void closeSession() { Session session = threadLocal.get(); //如果session不為null,則關閉session,並清空ThreadLocal if(session!=null) { session.close(); threadLocal.set(null); } } }

接下來進行測試:
首先建立MyThread.java並繼承Thread

import org.hibernate.Session;

public class MyThread extends Thread{

    @Override
    public void run() {
        Session session1 = SessionUtil.getSession();
        Session session2 = SessionUtil.getSession();
        Session session3 = SessionUtil.getSession();
        //獲取執行緒id
        long threadId = this.getId(); 
        //輸出session的hashCode,分辨是否是同一個session例項
        System.out.println("執行緒" +threadId+ ":\n" 
                + session1.hashCode() + "\n" 
                + session2.hashCode() + "\n"
                + session3.hashCode());
    }

}

建立Test.java

public class Test {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        MyThread thread3 = new MyThread();
        //啟動執行緒
        thread1.start();
        thread2.start();
        thread3.start();
    }
}

結果截圖:
這裡寫圖片描述
從結果中的hashCode可以看出,每條執行緒都有屬於自己的一個session例項。