posts - 60,comments - 71,trackbacks - 0

                  session是hibernate運做的核心,是有SessionFactory所創建,sessionFactory是線程安全的,你可以讓多個線程同時存取SessionFactory,而不會有資源共用的問題,然而session不是設計為線程安全的,所以讓多個線程共用一個session,將發生資料共用而發生混亂的問題.下面是一個標準類.
          import java.io.Serializable;
          import net.sf.hibernate.HibernateException;
          import net.sf.hibernate.Session;
          import net.sf.hibernate.SessionFactory;
          import net.sf.hibernate.Transaction;
          public class HibernateSessionUtil implements Serializable
          {
               
          //創建線程局部變量 tLocalsess 
              public static final ThreadLocal tLocalsess = new ThreadLocal();
             
          //創建線程局部變量 tLocaltx
          public static final ThreadLocal tLocaltx = new ThreadLocal();
                
          //取得session
              public static Session currentSession(){
                   
          //從線程變量tLocalsess中,取得當前session
          Session session = (Session) tLocalsess.get();
          //判斷session是否為空,如果為空,將創建一個session,并付給線程變量tLocalsess
              try{
          if (session == null){
          session 
          = openSession();
          tLocalsess.set(session);
          }

          }
          catch (HibernateException e){
          throw new InfrastructureException(e);
          }

          return session;
          }

          //關閉當前session
              public static void closeSession(){

                   
          //從線程變量tLocalsess中,取得當前session
          Session session = (Session) tLocalsess.get();
                   
          //設置線程變量tLocalsess為空
          tLocalsess.set(null);
          try{
                      
          //關閉session
          if (session != null && session.isOpen()){
          session.close();
          }

          }
          catch (HibernateException e){
          throw new InfrastructureException(e);
          }

          }

          //事物處理
              public static void beginTransaction(){
                
          //從線程變量tLocaltx中取得事物管理對象Transaction
                  Transaction tx = (Transaction) tLocaltx.get();
          try{
                      
          //如果為空就從session中創建一個tx
          if (tx == null){
          tx 
          = currentSession().beginTransaction();
          tLocaltx.set(tx);
          }

          }
          catch (HibernateException e){
          throw new InfrastructureException(e);
          }

          }

          //提交事物
              public static void commitTransaction(){
                
          //取得事物
          Transaction tx = (Transaction) tLocaltx.get();
          try{
                      
          //如果不為空就提交
          if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack())
          tx.commit();
          tLocaltx.set(
          null);
          }
          catch (HibernateException e){
          throw new InfrastructureException(e);
          }

          }

              
          //事物回滾    
              public static void rollbackTransaction(){
                   
          //取得tx事物
          Transaction tx = (Transaction) tLocaltx.get();
          try{
                      
          //將變量清空
          tLocaltx.set(null);
          if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()){
                          
          //事物回滾
          tx.rollback();
          }

          }
          catch (HibernateException e){
          throw new InfrastructureException(e);
          }

          }


             
          //取得session
          private static Session openSession() throws HibernateException{
          return getSessionFactory().openSession();
          }


             
          //取得sessionFactory
          private static SessionFactory getSessionFactory() throws HibernateException{
          return SingletonSessionFactory.getInstance();
          }

          }

          filter的代碼:
          public class HibernateSessionCloser implements Filter{
          protected FilterConfig filterConfig = null;
          public void init(FilterConfig filterConfig)throws ServletException{
          this.filterConfig = filterConfig;
          }

          public void destroy(){
          this.filterConfig = null;
          }

          public void doFilter(ServletRequest request, ServletResponse response,
          FilterChain chain)
          throws IOException, ServletException {
          try{
          chain.doFilter(request, response);
          }

          finally{
          try{
          HibernateSessionUtil.commitTransaction();
          }
          catch (InfrastructureException e){
          HibernateSessionUtil.rollbackTransaction();
          }
          finally{
          HibernateSessionUtil.closeSession();
          }

          }

          }

          }


          然后在web.xml配置filter就可以使用了.
          posted on 2008-05-18 20:36 henry1451 閱讀(630) 評論(0)  編輯  收藏 所屬分類: Hibernate技術
          主站蜘蛛池模板: 武定县| 津市市| 阜平县| 扶沟县| 曲沃县| 大洼县| 绍兴市| 大安市| 兰溪市| 视频| 翁牛特旗| 巩义市| 那坡县| 金坛市| 墨玉县| 桐乡市| 时尚| 革吉县| 胶州市| 吴旗县| 抚宁县| 仁化县| 新平| 奉化市| 长汀县| 姚安县| 大厂| 桐乡市| 平和县| 邵阳县| 田东县| 天等县| 大足县| 南木林县| 且末县| 托克逊县| 新河县| 西藏| 遂宁市| 富民县| 汝城县|