konhon

          忘掉過去,展望未來。找回自我,超越自我。
          逃避不一定躲的過, 面對(duì)不一定最難過, 孤單不一定不快樂, 得到不一定能長久, 失去不一定不再擁有, 可能因?yàn)槟硞€(gè)理由而傷心難過, 但我卻能找個(gè)理由讓自己快樂.

          Google

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            203 Posts :: 0 Stories :: 61 Comments :: 0 Trackbacks
          Session是由SessionFactory所創(chuàng)建,SessionFactory是執(zhí)行緒安全的(Thread-safe),您可以讓多個(gè)執(zhí)行緒同時(shí)存取SessionFactory而不會(huì)有資料共用的問題,然而Session則不是設(shè)計(jì)為執(zhí)行緒安全的,所以試圖讓多個(gè)執(zhí)行緒共用一個(gè) Session,將會(huì)產(chǎn)生因資料共用而發(fā)生混亂的問題。

          在Hibernate參考手冊中的 Quickstart with Tomcat 中,示範(fàn)了一個(gè)HibernateUtil,它使用了ThreadLocal類別來建立一個(gè)Session管理的輔助類,這是Hibernate的Session管理一個(gè)廣為應(yīng)用的解決方案,ThreadLocal是 Thread-Specific Storage 模式 的一個(gè)運(yùn)作實(shí)例。

          由於Thread-Specific Stroage模式可以有效隔離執(zhí)行緒所使用的資料,所以避開Session的多執(zhí)行緒之間的資料共用問題,以下列出Hibernate參考手冊中的HibernateUtil類:

          HibernateUtil.java
          import org.apache.commons.logging.Log;
          import org.apache.commons.logging.LogFactory;
          import org.hibernate.Session;
          import org.hibernate.SessionFactory;
          import org.hibernate.cfg.Configuration;

          /**
           * @author Administrator
           * 
           * TODO To change the template for this generated type comment go to Window -
           * Preferences - Java - Code Style - Code Templates
           
          */

          public class HibernateUtil {
              
          private static Log log = LogFactory.getLog(HibernateUtil.class);

              
          private static final SessionFactory sessionFactory;
              
          static {
                  
          try {
                      sessionFactory 
          = new Configuration().configure()
                              .buildSessionFactory();
                  }
           catch (Throwable ex) {
                      log.error(
          "Initial SessionFactory creation failed.", ex);
                      
          throw new ExceptionInInitializerError(ex);
                  }

              }


              
          public static final ThreadLocal session = new ThreadLocal();

              
          public static Session currentSession() {
                  Session s 
          = (Session) session.get();
                  
          if (s == null{
                      s 
          = sessionFactory.openSession();
                      session.
          set(s);
                  }

                  
          return s;
              }


              
          public static void closeSession() {
                  Session s 
          = (Session) session.get();
                  
          if (s != null)
                      s.clear();
                  session.
          set(null);
              }

          }


          在同一個(gè)執(zhí)行緒中,Session被暫存下來了,但無須擔(dān)心資料庫連結(jié)Connection持續(xù)占用問題,Hibernate會(huì)在真正需要資料庫操作時(shí)才(從連接池中)取得Connection。

          在程式中可以這麼使用HibernateUtil:
          Session session = HibernateUtil.currentSession();
          User user = (User) session.load(User.class, new Integer(1));
          System.out.println(user.getName());
          HibernateUtil.closeSession();

          在Web應(yīng)用程式中,可以藉助Filter來進(jìn)行Session管理,在需要的時(shí)候開啟Session,並在Request結(jié)束之後關(guān)閉Session,這個(gè)部份,在 JavaWorld 技術(shù)論壇Wiki 上有篇 在filter中關(guān)閉session 可以參考
          posted on 2005-08-10 20:14 konhon 優(yōu)華 閱讀(2240) 評(píng)論(0)  編輯  收藏 所屬分類: Hibernate
          主站蜘蛛池模板: 徐闻县| 大竹县| 陵水| 屏南县| 中西区| 墨玉县| 务川| 曲松县| 应城市| 塔城市| 富平县| 手游| 新化县| 清流县| 大连市| 绥江县| 商河县| 阜城县| 儋州市| 秦皇岛市| 攀枝花市| 克什克腾旗| 开化县| 宜州市| 托里县| 赣榆县| 东平县| 丰原市| 长治市| 明水县| 莱州市| 隆昌县| 都匀市| 永靖县| 潞西市| 罗定市| 龙川县| 濮阳县| 吉水县| 苏尼特右旗| 桂东县|