`
yushan
  • 浏览: 145960 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

hibernate session 过滤器控制

阅读更多

最近做一个公司项目的Demo,使用技术为jsp+dwr+hibernate,因为该Demo中所用的表多,有一对一,一对多和多对一的关系,所以利用hibernate的延迟加载(lazy="true")对性能的提高相当重要,但随之带来的session管理更为重要,弄不好常出现延迟加载异常,在这里我利用了Filter 来处理session的close的,相关代码如下:

 

1.HibernateSessionFactory.java(Eclipse自动生成,通过ThreadLocal 将session的非线程安全变成安全)

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;


public class HibernateSessionFactory {

    private static final Logger log = Logger.getLogger(SessionFactory.class) ;
	private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
    private static Configuration configuration = new Configuration();
    private static org.hibernate.SessionFactory sessionFactory;
    private static String configFile = CONFIG_FILE_LOCATION;

	static {
    	try {
			configuration.configure(configFile);
			sessionFactory = configuration.buildSessionFactory();
		} catch (Exception e) {
			
			log.error(" error creating sessionFactory") ;
			e.printStackTrace();
		}
    }
    public HibernateSessionFactory() {
    }
	

    public static Session getSession() throws HibernateException {
    	log.info("getSession is run") ;
    	
        Session session = (Session) threadLocal.get();
		if (session == null || !session.isOpen()) {
			log.info("SessionFactory.getSession() session is null or close") ;
			if (sessionFactory == null) {
				log.info("SessionFactory.getSession() rebuildSessionFactory() is running") ;
				rebuildSessionFactory();
			} 
			session = (sessionFactory != null) ? sessionFactory.openSession(): null;
			threadLocal.set(session);
		}

        return session;
    }


	public static void rebuildSessionFactory() {
		log.info("rebuildSessionFactory is run") ;
		try {
			configuration.configure(configFile);
			sessionFactory = configuration.buildSessionFactory();
		} catch (Exception e) {
			log.error("erro creating sessionFactory") ;
			e.printStackTrace();
		}
	}


    public static void closeSession() throws HibernateException {
    	log.info("closeSession is run") ;
    	
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);
        if (session != null) {
        	log.info("SessionFactory.closeSession() session is not null") ;
        	if(!session.isOpen()){
        		System.out.println("该 session 已经关闭") ;
        	}
            session.close();
        }
    }


	public static org.hibernate.SessionFactory getSessionFactory() {
		return sessionFactory;
	}


	public static void setConfigFile(String configFile) {
		SessionFactory.configFile = configFile;
		sessionFactory = null;
	}


	public static Configuration getConfiguration() {
		return configuration;
	}
	


}

 HibernateSessioniFactory主要负责session的开和关。

 

2.HibernateSessionFilter(要编写的过滤器,主要处理session的关闭)

import java.io.IOException;


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 org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.ad.session.HibernateSessionFactory;

public class HibernateSessionFilter implements Filter {  
    private static final Log log = LogFactory.getLog(HibernateSessionFilter.class);  
    
   
      @Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("HibernateSessionFilter is end") ;
	} 
  
   @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,  
            FilterChain chain) throws IOException, ServletException {  
        log.debug("HibernateSessionFilter start");  
        
        try{  
            //request 之前要处理的代码
            chain.doFilter(arg0, arg1);     
           //response之后要要处理的代码    
           
        }catch (Exception e) {  
            e.printStackTrace();             
        }   finally{          
            HibernateSessionFactory.closeSession();            
        }  
  
    }
  
     
   @Override
     public void destroy() {     
       System.out.println("HibernateSessionFilter is start") ;
     }  
  
}

  该过滤器只处理session的关闭,似乎有点浪费了,在这也可以加上字符集的处理。

  Filter运行原理(个人认为,有误请多指教):首先建立一个过滤类,需继承Filter接口,必须实现三个方法:

  init:服务器启动时运行该方法,运行期间不执行;

 doFilter:运行期间执行,其作用是request之前要做那些工作,response之后(即服务器将内容全部发回View层后)

               要做那些工作。每次访问服务器都会执行doFilter方法

 destroy:服务器终止时运行。

 

3. 在web.xml中的配置如下:

        <filter>
		<filter-name>hibernateSession</filter-name>
		<filter-class>
			com.c35.ad.filter.HibernateSessionFilter
		</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>hibernateSession</filter-name>
		<url-pattern>/*</url-pattern><!-- 过滤所有发回服务器的请求-->
	</filter-mapping>

 

  4.dao(demo中的UserDao)

 

public class UserDao  implements BaseDao {

	private static final Logger log = Logger.getLogger(UserDao.class);
    
	private  Session session  ;
   
	public UserDao(){
       log.info("UserDao construct is running") ;    
    	   session = SessionFactory.getSession() ;
    }
    

	@Override
	public boolean save(Object o) {
		log.info("UserDao save is running ");
		boolean flag = false ;	
		Transaction tran = null;	
		try {		
			tran = session.beginTransaction();
			session.save(o);
			tran.commit();
			flag = true ;
		} catch (Exception e) {
			log.error("error save user");
			flag = false ;
			if (tran != null) {
				try {
					tran.rollback();
				} catch (HibernateException e1) {
					log.error("save Transaction rollback is error "+e1.getMessage()) ;
				}
			}
			e.printStackTrace();
		}finally{
			//session.close() ;//这里就不需要在关闭session直接交给filter来处理
		}
		return flag ;
	}
}

    以上是本人的学习总结,有误之处请多多指教,希望对刚学hibernate的同志们有所帮助。

 

 

 

2
1
分享到:
评论
1 楼 ariyue 2008-11-07  
高手,学习中!

相关推荐

    过滤器对于session周期的控制

    对于hibernate中session周期的控制

    Hibernate+中文文档

    17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML映射元数据 18.3. 操作XML数据 19. 提升性能 19.1. 抓取策略(Fetching ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把helloapp应用作为独立应用程序运行  3.6.4 把helloapp应用作为...

    hibernate3.2中文文档(chm格式)

    17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML映射元数据 18.3. 操作XML数据 19. 提升性能 19.1. 抓取策略(Fetching ...

    HibernateAPI中文版.chm

    17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML映射元数据 18.3. 操作XML数据 19. 提升性能 19.1. 抓取策略(Fetching ...

    hibernate 教程

    乐观并发控制(Optimistic concurrency control) 10.4.1. 使用长生命周期带有自动版本化的会话 10.4.2. 使用带有自动版本化的多个会话 10.4.3. 应用程序自己进行版本检查 10.5. 会话断开连接(Session...

    Hibernate实战(第2版 中文高清版)

     11.1 传播Hibernate Session   11.1.1 Session传播的用例   11.1.2 通过线程局部传播   11.1.3 利用JTA传播   11.1.4 利用EJB传播   11.2 利用Hibernate的对话   11.2.1 提供对话保证   11.2.2 利用...

    拦截器和控制器的区别

    拦截器和过滤器的区别 1、拦截器基于动态代理 , 过滤器基于函数回调 2、拦截器不依赖于servlet容器,通过动态代理实现,过滤器依赖于servlet容器 3、拦截器在方法前后,异常前后等调用,而过滤器只能在请求前和请求...

    Hibernate中文详细学习文档

    17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML映射元数据 18.3. 操作XML数据 19. 提升性能 19.1. 抓取策略(Fetching ...

    Hibernate 中文 html 帮助文档

    17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML映射元数据 18.3. 操作XML数据 19. 提升性能 19.1. 抓取策略(Fetching ...

    最全Hibernate 参考文档

    17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML映射元数据 18.3. 操作XML数据 19. 提升性能 19.1. 抓取策略(Fetching ...

    hibernate 体系结构与配置 参考文档(html)

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 ... Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML映射...

    Hibernate教程

    18.1. Hibernate 过滤器(filters) 19. XML映射 19.1. 用XML数据进行工作 19.1.1. 指定同时映射XML和类 19.1.2. 只定义XML映射 19.2. XML映射元数据 19.3. 操作XML数据 20. 提升性能 20.1. 抓取策略(Fetching ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML映射元数据 18.3. 操作XML数据 19. 提升性能 19.1. 抓取策略(Fetching ...

    SSH的jar包.rar

    2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 3、接着FilterDispatcher被调用,...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把helloapp应用作为独立应用程序运行  3.6.4 把helloapp应用作为...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把helloapp应用作为独立应用程序运行  3.6.4 把helloapp应用作为...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把helloapp应用作为独立应用程序运行  3.6.4 把helloapp应用作为...

    hibernate

    乐观并发控制(Optimistic concurrency control) 10.4.1. 使用长生命周期带有自动版本化的会话 10.4.2. 使用带有自动版本化的多个会话 10.4.3. 应用程序自己进行版本检查 10.5. 会话断开连接(Session...

Global site tag (gtag.js) - Google Analytics