konhon

          忘掉過去,展望未來。找回自我,超越自我。
          逃避不一定躲的過, 面對不一定最難過, 孤單不一定不快樂, 得到不一定能長久, 失去不一定不再擁有, 可能因為某個理由而傷心難過, 但我卻能找個理由讓自己快樂.

          Google

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

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

          由於Thread-Specific Stroage模式可以有效隔離執行緒所使用的資料,所以避開Session的多執行緒之間的資料共用問題,以下列出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);
              }

          }


          在同一個執行緒中,Session被暫存下來了,但無須擔心資料庫連結Connection持續占用問題,Hibernate會在真正需要資料庫操作時才(從連接池中)取得Connection。

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

          在Web應用程式中,可以藉助Filter來進行Session管理,在需要的時候開啟Session,並在Request結束之後關閉Session,這個部份,在 JavaWorld 技術論壇Wiki 上有篇 在filter中關閉session 可以參考
          posted on 2005-08-10 20:14 konhon 優華 閱讀(2240) 評論(0)  編輯  收藏 所屬分類: Hibernate
          主站蜘蛛池模板: 灌阳县| 甘孜| 孝义市| 仁化县| 花莲县| 濮阳市| 蒙自县| 永善县| 合水县| 务川| 惠水县| 达州市| 孟村| 新营市| 巫山县| 荣成市| 徐州市| 沁水县| 萨迦县| 武冈市| 定南县| 伊宁市| 资兴市| 阿勒泰市| 宁南县| 兰坪| 瓦房店市| 新平| 交口县| 安吉县| 深圳市| 丹巴县| 台中市| 皮山县| 行唐县| 迁安市| 麻阳| 安康市| 荃湾区| 皮山县| 仪陇县|