隨筆-57  評論-202  文章-17  trackbacks-0
                這一節是非常實用的一節,我在閱讀此書的時候,一直在迷惑,究竟應該怎樣管理Session呢?因為Session的管理是如此重要,類似于以前寫程序對JDBC Connection的管理??赐甏斯澓螅K于找到了方法。
                在各種Session管理方案中,ThreadLocal模式得到了大量使用。ThreadLocal是Java中一種較為特殊的線程綁定機制。通過ThreadLocal存取的數據,總是與當前線程相關,也就是說,JVM為每個運行的線程,綁定了私有的本定實例存取空間,從而為多線程環境經常出現的并發訪問問題提供了一種隔離機制。
                下面是Hibernate官方提供的一個ThreadLocal工具:


          import net.sf.hibernate.
          *;
          import net.sf.hibernate.cfg.
          *;
          import org.apache.log4j.Logger;

          /**
           * <p>Title: </p>
           *
           * <p>Description: Session的管理類</p>
           *
           * <p>Copyright: Copyright (c) 2005</p>
           *
           * <p>Company: </p>
           *
           * @author George Hill
           * @version 1.0
           
          */


          public class HibernateUtil {

            
          private static final Logger log = Logger.getLogger(HibernateUtil.class);

            
          private static final SessionFactory sessionFactory;

            
          /**
             * 初始化Hibernate配置
             
          */

            
          static {
              
          try {
                
          // Create the SessionFactory
                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();

            
          /**
             * 根據當前線程獲取相應的Session
             * @return Session
             * @throws HibernateException
             
          */

            
          public static Session currentSession() throws HibernateException {
              Session s 
          = (Session) session.get();
              
          // Open a new Session, if this Thread has none yet
              if (s == null{
                s 
          = sessionFactory.openSession();
                session.
          set(s);
              }

              
          return s;
            }


            
          /**
             * 返回Session給相應的線程
             * @throws HibernateException
             
          */

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


          }


                針對WEB程序,還可以利用Servlet2.3的Filter機制,輕松實現線程生命周期內的Session管理。下面是一個通過Filter進行Session管理的典型案例:

          public class PersistenceFilter implements Filter {
            
          protected static ThreadLocal hibernateHolder = new ThreadLocal();

            
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
              hibernateHolder.
          set(getSession());
              
          try {
                
                chain.doFilter(request, response);
                
              }
           finally {
                Session session 
          = (Session) hibernateHolder.get();
                
          if (session != null{
                  hibernateHolder.
          set(null);
                  
          try {
                    session.close();
                  }
           catch (HibernateException ex) {
                    
          throw new ServletException(ex);
                  }

                }

              }

            }

            
          }
          posted on 2005-07-29 19:43 小米 閱讀(3944) 評論(1)  編輯  收藏 所屬分類: Hibernate

          評論:
          # re: 《深入淺出Hibernate》讀書筆記(9)——Session管理 2005-11-06 15:07 | jiniboy
          這都是你總結的嗎   回復  更多評論
            
          主站蜘蛛池模板: 周宁县| 陈巴尔虎旗| 铜鼓县| 静安区| 喀喇沁旗| 拉孜县| 林口县| 博野县| 姜堰市| 南召县| 鹤山市| 格尔木市| 固原市| 泾川县| 策勒县| 托里县| 保德县| 玛多县| 嘉峪关市| 察雅县| 台安县| 边坝县| 静海县| 敖汉旗| 兴义市| 江都市| 玛沁县| 分宜县| 嘉义县| 临澧县| 顺义区| 体育| 荆门市| 温州市| 昭平县| 泾源县| 苏尼特右旗| 永胜县| 永仁县| 乌兰县| 太保市|