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

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

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

    eric-1001c

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      3 隨筆 :: 45 文章 :: 12 評論 :: 0 Trackbacks

    在利用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í)行順序的線程對你的一條記錄進行操作的情形嗎?

    在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)(為了簡單,沒有考慮集合的泛型):

    public  class  ThreadLocal  {
    private Map values = Collections.synchronizedMap(new HashMap());
    public Object get() {
    Thread currentThread = Thread.currentThread();
    Object result = values.get(currentThread);
    if(result == null&&!values.containsKey(currentThread)) {
    result = initialValue();
    values.put(currentThread, result);
    }
    return result;
    }
    public void set(Object newValue) {
    values.put(Thread.currentThread(), newValue);
    }
    public Object initialValue() {
    return null;
    }
    }

    那麼具體如何利用ThreadLocal來管理Session呢?Hibernate官方文檔手冊的示例之中,提供了一個通過ThreadLocal維護Session的好榜樣:

    public  class  HibernateUtil  {
    public static final SessionFactory sessionFactory;
    static {
    try {
    sessionFactory = new Configuration().configure().buildSessionFactory();
    } catch (Throwable ex) {
    throw new ExceptionInInitializerError(ex);
    }
    }
    public static final ThreadLocal<Session>session=new ThreadLocal<Session>();
    public static Session currentSession() throws HibernateException {
    Session s = session.get();
    if(s == null) {
    s = sessionFactory.openSession();
    session.set(s);
    }
    return s;
    }
    public static void closeSession() throws HibernateException {
    Session s = session.get();
    if(s != null) {
    s.close();
    }
    session.set(null);
    }
    }

    只要借助上面的工具類獲取Session實例,我們就可以實現(xiàn)線程范圍內(nèi)的Session共享,從而避免了線程中頻繁的創(chuàng)建和銷毀Session實 例。當然,不要忘記在用完后關閉Session。寫到這里,想再多說一些,也許大多數(shù)時候我們的DAO并不會涉及到多線程的情形,比如我們不會將DAO的 代碼寫在Servlet之中,那樣不是良好的設計,我自己通常會在service層的代碼里訪問DAO的方法。但是我還是建議采用以上的工具類來管理 Session,畢竟我們不能僅僅考慮今天為自己做什么,還應該考慮明天為自己做什么!

    posted on 2008-03-13 17:04 Eric-1001c 閱讀(303) 評論(0)  編輯  收藏 所屬分類: Hibernate
    主站蜘蛛池模板: 国产乱弄免费视频| 亚洲一区二区三区成人网站| 激情97综合亚洲色婷婷五| 久久亚洲国产精品一区二区| 亚洲不卡1卡2卡三卡2021麻豆| 免费人成再在线观看网站| 最近免费视频中文字幕大全| 亚洲精品国产综合久久一线| 亚洲精品国产肉丝袜久久| yellow视频免费在线观看| 成人免费午夜视频| 亚洲综合日韩中文字幕v在线| 色一情一乱一伦一视频免费看| 国产成人精品免费视频大| 亚洲国产免费综合| 亚洲av成人一区二区三区| 西西大胆无码视频免费| 亚洲视频精品在线| 国产精品免费看久久久香蕉| 免费毛片在线播放| 亚洲最大成人网色香蕉| 免费国产成人18在线观看| 亚洲中文字幕视频国产| 99亚洲精品卡2卡三卡4卡2卡| 韩国免费一级成人毛片| 91亚洲导航深夜福利| 13小箩利洗澡无码视频网站免费| 亚洲第一网站男人都懂| 最近免费中文字幕中文高清 | 免费人成网上在线观看| 亚洲男人的天堂www| 一级做a爰片久久毛片免费看 | 亚洲一区中文字幕在线电影网| 永久免费av无码网站韩国毛片| 香蕉视频在线观看免费| 亚洲Av综合色区无码专区桃色| 手机看片国产免费永久| 亚洲丰满熟女一区二区v| 在线观看免费人成视频色| 羞羞视频免费观看| 久久亚洲精品无码AV红樱桃|