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. }