文章出處

如果定義了一個單實例的java bean,它有若干屬性,但是有一個屬性不是線程安全的,比如說HashMap。并且碰巧你并不需要在不同的線程中共享這個屬性,也就是說這個屬性不存在跨線程的意義。那么不推薦使用sychronize,可使用ThreadLocal

關鍵代碼如下:

package cn.happy.util;

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

public class ThreadUtil {
        // 初始化一個ThreadLocal對象    
        private static final ThreadLocal sessionTL = new ThreadLocal(); 
        private static Configuration configuration;
        private final static SessionFactory sessionFactory;
        static {
            try {
                configuration = new Configuration().configure();
                sessionFactory = configuration.buildSessionFactory();
            } catch (Throwable ex) {
                throw new ExceptionInInitializerError(ex);
            }
        }
        public static Session currentSession() {
            //sessionTL的get()方法根據當前線程返回其對應的線程內部變量,
            //也就是我們需要的Session,多線程情況下共享數據庫連接是不安全的。
            //ThreadLocal保證了每個線程都有自己的Session。
            Session session = (Session) sessionTL.get(); 
            // 如果session為null,則打開一個新的session
            if (session == null) { 
                //創建一個數據庫連接對象session。
                session = sessionFactory.openSession(); 
                // 保存該數據庫連接session到ThreadLocal中。
                sessionTL.set(session); 
            }
            //如果當前線程已經訪問過數據庫了,
            //則從sessionTL中get()就可以獲取該線程上次獲取過的數據庫連接對象。
            return session; 
        }
        
        
        /**
         * 關閉Session
         */
        public static void closeSession(){
            Session session = (Session) sessionTL.get(); 
            sessionTL.set(null);
            session.close();
        }
}

①初始化一個ThreadLocal對象,該對象有get()、set()方法

②sessionTL的get()方法根據當前線程返回其對應的線程內部變量  也就是我們需要的Session,多線程情況下共享數據庫連接是不安全的。 ThreadLocal保證了每個線程都有自己的Session。

③ 如果該線程是初次訪問,session是NULL,則創建一個Session對象

④創建一個Session對象,保存該對象到ThreadLocal中

⑤ 如果當前線程已經訪問過數據庫,則從SessionTL中get()就可以獲取該線程上次獲取過得Session對象

⑥關閉Session,通過ThreadLocal類,既實現了多線程并發,同時,也實現了Singleton單例模式

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()