当前位置 : 主页 > 手机开发 > harmonyos >

利用过滤器对hibernate的session管理,实现session在线程范围内的共享

来源:互联网 收集:自由互联 发布时间:2023-08-26
hibernate中的Session关系到对数据库的增删查改等基本的数据存取操作.对Session进行有效的维护,就像是在jdbc编程中对JDBC collection的维护. 在struts+hibernate的方案中,常常利用过滤器(Filter)对s


hibernate中的Session关系到对数据库的增删查改等基本的数据存取操作.对Session进行有效的维护,就像是在jdbc编程中对JDBC collection的维护.
     在struts+hibernate的方案中,常常利用过滤器(Filter)对session进行管理,以实现session在线程范围内的共享.为什么仅仅实现线程内的共享,是因为,不能把session用于多线程,否则会出现意外.在线程范围内实现sesion的共享.避免了session的频繁的创建和销毁.我看到有的程序中,在单个方法内,打开session,执行.关闭session.这显然没有在一次会话中有效的利用session
     下面的方案是.通过建立一个过滤器,以实现对sesion的共享:



Java代码


package com.cs_oj.filter;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
import org.hibernate.Transaction;


import com.cs_oj.data.dao.HibernateSessionFactory;

public class HibernateSessionFilter implements Filter {
    private static final Log log = LogFactory.getLog(HibernateSessionFilter.class);
    public void destroy() {
        // TODO Auto-generated method stub

    }

    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain chain) throws IOException, ServletException {
        log.debug("HibernateSessionFilter start");
        Date date=new Date();
        DateFormat df=new SimpleDateFormat("yyyy-MM-dd '时间--'HH:mm:ss");
        System.out.println("----当前时间:"+df.format(date)+"----");
        System.out.println("----------HibernateSessionFilter start-----------");

//利用HibernateSessionFactory, 得到当 前线程中的session对象..HibernateSessionFactory的代码利用了ThreadLocal模式..详见..HibernateSessionFactory
        Session session=HibernateSessionFactory.getSession(); 
        log.info("HibernateSessionFilter begin transaction");
        System.out.println("HibernateSessionFilter begin transaction");
       Transaction tx=session.beginTransaction();   //开始事务
        
        log.debug("HibernateSessionFilter begin doChain");
        HttpServletResponse response=(HttpServletResponse)arg1;
        try{
            chain.doFilter(arg0, arg1);
            
            log.debug("HibernateSessionFilter begin commit");
            //没有异常,则提交
            try{
                
                System.out.println("HibernateSessionFilter begin commit");
                tx.commit();
                System.out.println("HibernateSessionFilter commit success");
                
            }
            catch(Exception e){
                
                System.out.println("HibernateSessionFilter commit failed");
                System.out.println("HibernateSessionFilter begin rollback() ");
                try{
                    System.out.println("HibernateSessionFilter begin rollback() ");
                    tx.rollback();
                    System.out.println("HibernateSessionFilter rollback() success ");
                }catch(RuntimeException ex){
                    System.out.println("HibernateSessionFilter   rollback() failed");
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
            System.out.println("chain.doFilter(arg0, arg1) exception accurs ");
            System.out.println("HibernateSessionFilter begin rollback() ");
            tx.rollback();   //出现异常,回滚
            //response.sendRedirect("error.jsp");
        }
        finally{
            log.debug("HibernateSessionFilter end doChain");
            System.out.println("HibernateSessionFilter begin close session");
           HibernateSessionFactory.closeSession();
            System.out.println("*********HibernateSessionFilter close session success*********");
            log.debug("HibernateSessionFilter begin close session");
            //System.out.println("session.isOpen()="+session.isOpen());
        }

    }

}

 

 

 

在web.xml文件中对上面的过滤器进行配置.



Xml代码

<filter>
    <filter-name>hibernateSession</filter-name>
    <filter-class>com.cs_oj.filter.HibernateSessionFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>hibernateSession</filter-name>
    <servlet-name>action</servlet-name>
   
</filter-mapping>
<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>.
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>


 

 

则对所有以.do作为后缀名的url,都会被过滤器过滤.在被过滤器过滤的action中,和业务层的方法内,只需要调用HibernateSessionFactory 的getSession()方法,得到当前线程内的session对象.用完session后,不要关闭session,而且,每次在用session进行添加和修改操作时,也不需要启动事务.

 

 

HibernateSessionFactory.java

 



Java代码

 
    
  
1. package
2.   
3. import
4. import
5. import
6.   
7.   
8. public class
9.   
10. /**  
11.      * Location of hibernate.cfg.xml file. 
12.      * Location should be on the classpath as Hibernate uses  
13.      * #resourceAsStream style lookup for its configuration file.  
14.      * The default classpath location of the hibernate config file is  
15.      * in the default package. Use #setConfigFile() to update  
16.      * the location of the configuration file for the current session.    
17.      */
18. private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";    
19. private static final ThreadLocal<Session> threadLocal = new
20. private static Configuration configuration = new
21. private static
22. private static
23.   
24. private
25.     }   
26.        
27. /** 
28.      * Returns the ThreadLocal Session instance. Lazy initialize 
29.      * the <code>SessionFactory</code> if needed. 
30.      * 
31.      * @return Session 
32.      * @throws HibernateException 
33.      */
34. public static Session getSession() throws
35.         Session session = threadLocal.get();   
36.   
37. if (session == null
38. if (sessionFactory == null) {    
39.                 rebuildSessionFactory();   
40.             }   
41. null) ? sessionFactory.openSession()    
42. null;    
43.             threadLocal.set(session);   
44.         }   
45.   
46. return
47.     }   
48.   
49. /** 
50.      * Rebuild hibernate session factory 
51.      * 
52.      */
53. public static void
54. try
55. //configuration.configure(); 
56.             sessionFactory = configuration.buildSessionFactory();   
57. catch
58.             System.err   
59. "%%%% Error Creating SessionFactory %%%%");    
60.             e.printStackTrace();   
61.         }   
62.     }   
63.   
64. /** 
65.      * Close the single hibernate session instance. 
66.      * 
67.      * @throws HibernateException 
68.      */
69. public static void closeSession() throws
70.         Session session = threadLocal.get();   
71. null);    
72.   
73. if (session != null) {    
74.             session.close();   
75.         }   
76.     }   
77.   
78. /** 
79.      * return session factory 
80.      * 
81.      */
82. public static
83. return
84.     }   
85.   
86. /** 
87.      * return session factory 
88.      * 
89.      *    session factory will be rebuilded in the next call 
90.      */
91. public static void
92.         HibernateSessionFactory.configFile = configFile;   
93. null;    
94.     }   
95.   
96. /** 
97.      * return hibernate configuration 
98.      * 
99.      */
100. public static
101. return
102.     }   
103.   
104. }
上一篇:Android WebKit 简单例子
下一篇:没有了
网友评论