hibernate中的Session关系到对数据库的增删查改等基本的数据存取操作.对Session进行有效的维护,就像是在jdbc编程中对JDBC collection的维护.
在struts+hibernate的方案中,常常利用过滤器(Filter)对session进行管理,以实现session在线程范围内的共享.为什么仅仅实现线程内的共享,是因为,不能把session用于多线程,否则会出现意外.在线程范围内实现sesion的共享.避免了session的频繁的创建和销毁.我看到有的程序中,在单个方法内,打开session,执行.关闭session.这显然没有在一次会话中有效的利用session
下面的方案是.通过建立一个过滤器,以实现对sesion的共享:
- 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());
- }
- }
- }
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文件中对上面的过滤器进行配置.
- <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>
<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
- package com.cs_oj.data.dao;
- import org.hibernate.HibernateException;
- import org.hibernate.Session;
- import org.hibernate.cfg.Configuration;
- public class HibernateSessionFactory {
- /**
- * Location of hibernate.cfg.xml file.
- * Location should be on the classpath as Hibernate uses
- * #resourceAsStream style lookup for its configuration file.
- * The default classpath location of the hibernate config file is
- * in the default package. Use #setConfigFile() to update
- * the location of the configuration file for the current session.
- */
- private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
- private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
- private static Configuration configuration = new Configuration().configure();
- private static org.hibernate.SessionFactory sessionFactory;
- private static String configFile = CONFIG_FILE_LOCATION;
- private HibernateSessionFactory() {
- }
- /**
- * Returns the ThreadLocal Session instance. Lazy initialize
- * the <code>SessionFactory</code> if needed.
- *
- * @return Session
- * @throws HibernateException
- */
- public static Session getSession() throws HibernateException {
- Session session = threadLocal.get();
- if (session == null || !session.isOpen()) {
- if (sessionFactory == null) {
- rebuildSessionFactory();
- }
- session = (sessionFactory != null) ? sessionFactory.openSession()
- : null;
- threadLocal.set(session);
- }
- return session;
- }
- /**
- * Rebuild hibernate session factory
- *
- */
- public static void rebuildSessionFactory() {
- try {
- //configuration.configure();
- sessionFactory = configuration.buildSessionFactory();
- } catch (Exception e) {
- System.err
- .println("%%%% Error Creating SessionFactory %%%%");
- e.printStackTrace();
- }
- }
- /**
- * Close the single hibernate session instance.
- *
- * @throws HibernateException
- */
- public static void closeSession() throws HibernateException {
- Session session = threadLocal.get();
- threadLocal.set(null);
- if (session != null) {
- session.close();
- }
- }
- /**
- * return session factory
- *
- */
- public static org.hibernate.SessionFactory getSessionFactory() {
- return sessionFactory;
- }
- /**
- * return session factory
- *
- * session factory will be rebuilded in the next call
- */
- public static void setConfigFile(String configFile) {
- HibernateSessionFactory.configFile = configFile;
- sessionFactory = null;
- }
- /**
- * return hibernate configuration
- *
- */
- public static Configuration getConfiguration() {
- return configuration;
- }
- }
相关推荐
21.5 利用Hibernate的版本控制来实现乐观锁 21.5.1 使用元素 21.5.2 使用元素 21.5.3 对游离对象进行版本检查 21.5.4 强制更新版本 21.6 实现乐观锁的其他方法 21.7 小结 21.8 思考题 第22章 管理...
第一部分 从Hibernate和EJB 3.0开始 第1章 理解对象/关系持久化 1.1 什么是持久化 1.1.1 关系数据库 1.1.2 理解SQL 1.1.3 在Java中使用SQL 1.1.4 面向对象应用程序中的持久化 1.2 范式不...
21.5 利用Hibernate的版本控制来实现乐观锁 21.5.1 使用元素 21.5.2 使用元素 21.5.3 对游离对象进行版本检查 21.5.4 强制更新版本 21.6 实现乐观锁的其他方法 21.7 小结 21.8 思考题 第22章 管理...
21.5 利用Hibernate的版本控制来实现乐观锁 21.5.1 使用元素 21.5.2 使用元素 21.5.3 对游离对象进行版本检查 21.5.4 强制更新版本 21.6 实现乐观锁的其他方法 21.7 小结 21.8 思考题 第22章 管理...
21.5 利用Hibernate的版本控制来实现乐观锁 21.5.1 使用元素 21.5.2 使用元素 21.5.3 对游离对象进行版本检查 21.5.4 强制更新版本 21.6 实现乐观锁的其他方法 21.7 小结 21.8 思考题 第22章 管理...
管理Session缓存 14.5. 查询缓存(Query Cache) 15. 工具箱指南 15.1. Schema 生成器(Schema Generation) 15.1.1. 对schema定制化(Customizing the schema) 15.1.2. 运行该工具 15.1.3. 属性...
管理Session缓存 14.5. 查询缓存(Query Cache) 15. 工具箱指南 15.1. Schema 生成器(Schema Generation) 15.1.1. 对schema定制化(Customizing the schema) 15.1.2. 运行该工具 15.1.3. 属性...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...