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 優華 閱讀(2245) 評論(0)  編輯  收藏 所屬分類: Hibernate
          主站蜘蛛池模板: 邵阳县| 中牟县| 瓮安县| 濮阳县| 郴州市| 镇远县| 固始县| 固安县| 县级市| 灌阳县| 个旧市| 茂名市| 双江| 柳江县| 新化县| 山阴县| 大连市| 平阳县| 惠安县| 吉首市| 莱州市| 上饶县| 鄂伦春自治旗| 思茅市| 富宁县| 莱芜市| 东乌珠穆沁旗| 昆山市| 迁西县| 红原县| 洞头县| 比如县| 三门县| 晴隆县| 青浦区| 上蔡县| 都江堰市| 额尔古纳市| 新野县| 什邡市| 贵州省|