<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Dict.CN 在線詞典, 英語學習, 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統(tǒng)計

    留言簿(23)

    積分與排名

    優(yōu)秀學習網(wǎng)站

    友情連接

    閱讀排行榜

    評論排行榜

    利于ThreadLocal管理Hibernate Session (zhuan)

         在利用Hibernate開發(fā)DAO模塊時,我們和Session打的交道最多,所以如何合理的管理Session,避免Session的頻繁創(chuàng)建和銷毀,對于提高系統(tǒng)的性能來說是非常重要的,以往是通過eclipse的插件來自動完成這些代碼的,當然效果是不錯的,但是總是覺得不爽(沒有讀懂那些冗長的代碼),所以現(xiàn)在打算自己實現(xiàn)Session管理的代碼。我們知道Session是由SessionFactory負責創(chuàng)建的,而SessionFactory的實現(xiàn)是線程安全的,多個并發(fā)的線程可以同時訪問一個SessionFactory并從中獲取Session實例,那么Session是否是線程安全的呢?很遺憾,答案是否定的。Session中包含了數(shù)據(jù)庫操作相關的狀態(tài)信息,那么說如果多個線程同時使用一個Session實例進行CRUD,就很有可能導致數(shù)據(jù)存取的混亂,你能夠想像那些你根本不能預測執(zhí)行順序的線程對你的一條記錄進行操作的情形嗎?
     1public class ThreadLocal {    
     2     private Map values = Collections.synchronizedMap(new HashMap());    
     3     public Object get() {    
     4        Thread currentThread = Thread.currentThread();     
     5        Object result = values.get(currentThread);     
     6        if(result == null&&!values.containsKey(currentThread)) {    
     7           result = initialValue();    
     8           values.put(currentThread, result);     
     9        }
        
    10        return result;     
    11     }
        
    12     public void set(Object newValue) {    
    13        values.put(Thread.currentThread(), newValue);    
    14     }
        
    15     public Object initialValue() {    
    16        return null;     
    17     }
        
    18}
       


     1public class HibernateUtil {    
     2       public static final SessionFactory sessionFactory;    
     3       static {    
     4           try {    
     5                 sessionFactory = new Configuration().configure()    
     6                                   .buildSessionFactory();    
     7           }
     catch (Throwable ex) {    
     8                throw new ExceptionInInitializerError(ex);    
     9           }
        
    10       }
        
    11       public static final ThreadLocal session =     
    12                                            new ThreadLocal();    
    13       public static Session currentSession() throws HibernateException {    
    14               Session s = session.get();    
    15               if(s == null{    
    16                     s = sessionFactory.openSession();    
    17                     session.set(s);    
    18               }
        
    19               return s;    
    20       }
        
    21       public static void closeSession() throws HibernateException {    
    22                Session s = session.get();    
    23                if(s != null{    
    24                      s.close();    
    25                }
        
    26                session.set(null);    
    27       }
        
    28}
       
    29


          在Session的眾多管理方案中,我們今天來認識一種名為ThreadLocal模式的解決方案。
          早在Java1.2推出之時,Java平臺中就引入了一個新的支持:java.lang.ThreadLocal,給我們在編寫多線程程序時提供了一種新的選擇。ThreadLocal是什么呢?其實ThreadLocal并非是一個線程的本地實現(xiàn)版本,它并不是一個Thread,而是thread local variable(線程局部變量)。也許把它命名為ThreadLocalVar更加合適。線程局部變量(ThreadLocal)其實的功用非常簡單,就是為每一個使用該變量的線程都提供一個變量值的副本,是每一個線程都可以獨立地改變自己的副本,而不會和其它線程的副本沖突。從線程的角度看,就好像每一個線程都完全擁有一個該變量。
          ThreadLocal是如何做到為每一個線程維護變量的副本的呢?其實實現(xiàn)的思路很簡單,在ThreadLocal類中有一個Map,用于存儲每一個線程的變量的副本。比如下面的示例實現(xiàn)(為了簡單,沒有考慮集合的泛型):   只要借助上面的工具類獲取Session實例,我們就可以實現(xiàn)線程范圍內(nèi)的Session共享,從而避免了線程中頻繁的創(chuàng)建和銷毀Session實例。當然,不要忘記在用完后關閉Session。
         寫到這里,想再多說一些,也許大多數(shù)時候我們的DAO并不會涉及到多線程的情形,比如我們不會將DAO的代碼寫在Servlet之中,那樣不是良好的設計,我自己通常會在service層的代碼里訪問DAO的方法。但是我還是建議采用以上的工具類來管理Session,畢竟我們不能僅僅考慮今天為自己做什么,還應該考慮明天為自己做什么!

    posted on 2007-12-04 09:28 都市淘沙者 閱讀(566) 評論(0)  編輯  收藏 所屬分類: Hibernate/ORM

    主站蜘蛛池模板: 免费高清在线影片一区| 一区二区三区免费视频观看| baoyu122.永久免费视频| 无码欧精品亚洲日韩一区夜夜嗨 | 国产精品成人免费福利| 亚洲第一精品在线视频| a视频免费在线观看| 亚洲成av人片天堂网| 99久久久国产精品免费牛牛| 78成人精品电影在线播放日韩精品电影一区亚洲 | 亚洲av无码不卡私人影院| 色老头综合免费视频| 国产亚洲精品精品国产亚洲综合| 中国一级特黄的片子免费| 久久青草亚洲AV无码麻豆| 免费无码又爽又刺激高潮视频 | 亚洲av中文无码乱人伦在线观看 | 亚洲一线产品二线产品| 免费一级做a爰片久久毛片潮喷| 日韩大片免费观看视频播放| 亚洲三区在线观看无套内射| 99久久国产免费中文无字幕 | 免费人人潮人人爽一区二区| 亚洲欧洲无码AV电影在线观看 | 最近2019中文字幕免费大全5 | 91人人区免费区人人| 在线亚洲午夜片AV大片| 亚洲成av人片天堂网老年人| 今天免费中文字幕视频| 亚洲精品123区在线观看| 亚洲成a人片在线观看久| 足恋玩丝袜脚视频免费网站| 亚洲砖码砖专无区2023| 久久亚洲高清综合| 91高清免费国产自产| 亚洲伊人久久精品| 免费A级毛片在线播放不收费| 成全视频免费观看在线看| 在线综合亚洲欧洲综合网站| 免费一级黄色毛片| 最近免费中文字幕mv在线电影|