`

hibernate Session在OpenSessionInView资源的获得和关闭

阅读更多
这是一个过滤器,用于确保关闭session资源,也用于获得session资源:HibernateFilter.getSession()


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.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateFilter implements Filter {
	
	private static ThreadLocal hibernaThreadLocal = new ThreadLocal();
	private static SessionFactory factory;

	public void destroy() {
		
	}

	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
		try {
			//加载页面之前
			filterChain.doFilter(servletRequest, servletResponse);
		}finally {
			//页面加载完hibernate使用的对象后关闭资源
			Session session = (Session)hibernaThreadLocal.get();
			if(session != null) {
				if(session.isOpen()) {
					session.close();
				}
				hibernaThreadLocal.remove();
			}
		}
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		try {
			Configuration cfg = new Configuration().configure();
			factory = cfg.buildSessionFactory();
		}catch(Exception e) {
			e.printStackTrace();
			throw new ServletException(e);
		}
		
	}
	
	public static Session getSession() {
		Session session = (Session)hibernaThreadLocal.get();
		if(session == null) {
			session = factory.openSession();
			hibernaThreadLocal.set(session);
		}
		return session;
	}
}

分享到:
评论
2 楼 qsrock 2009-09-25  
zhaomengsen 写道
OpenSessionInView 大项目是不能用到 。你想一想延迟session的到时间 虽然解决来懒加载问题。 又有来新到问题。与数据连接是有限。 网速越慢问题越多。

哈哈!是的确实应该是这样!这个应该是小项目才用的,数据库的连接时间是比较短的,一般配置个连接池来限定时间!我现在公司内部的项目都是一直500人左右同时在线操作,如果被大量刷新比较复杂的页面的时候就会使系统很慢,连接爆满!不过大部分时间还是没什么问题的!
1 楼 zhaomengsen 2009-09-25  
OpenSessionInView 大项目是不能用到 。你想一想延迟session的到时间 虽然解决来懒加载问题。 又有来新到问题。与数据连接是有限。 网速越慢问题越多。

相关推荐

    Spring hibernate opensessioninview

    综上所述,`OpenSessionInViewFilter`作为一种简化Hibernate Session管理和事务处理的方式,在适当的场景下能够极大地提高开发效率和代码质量。但在使用时也需要注意其潜在的性能影响和其他风险,合理选择是否启用该...

    Struts Spring Hibernate 整合 OpenSessionInView 例子

    为了练手培训,给大家准备的 Open Session In View 的简单例子,纯代码,大家可以参考,其中主要说了六部分内容: 1.通过接口编程 2.通过spring注入dao到 action 3.通过 open session in view filter 支持 延迟加载...

    OpenSessionInView项目整合jar包

    2. **启用OpenSessionInView过滤器**:在web.xml中配置OpenSessionInViewFilter,该过滤器会在HTTP请求开始时开启一个新的Hibernate Session,并在请求结束时提交或回滚事务并关闭Session。 3. **编写业务逻辑**:在...

    Open_Session_In_View详解.doc

    `Open Session In View`的主要作用是在Web请求的开始阶段打开`Hibernate session`,并在请求结束时自动关闭该session。这样做的好处在于,可以确保在整个请求处理过程中session始终处于可用状态,使得在视图(View)层...

    hibernate 中的lazy属性祥解.txt

    1. **在关闭Session之前初始化关联对象**:在关闭Session前,可以显式调用`Hibernate.initialize()`方法来初始化关联对象,确保数据已经加载到内存中。 2. **使用OpenSessionInView模式**:这是一种常用的设计模式,...

    韩顺平spring 雇员管理系统hibernate jar包

    《韩顺平Spring雇员管理系统中的Hibernate ORM框架详解》 ...这个压缩包中的"hibernate jar包"是实现这些功能的关键,它包含Hibernate运行所需的类和库,是开发者在项目中使用Hibernate不可或缺的部分。

    hibernate面试题总结

    - **OpenSessionInView**:是一种设计模式,用于Web应用中,通过过滤器在请求开始时打开`Session`,结束时关闭,确保整个请求过程中`Session`可用,从而支持延迟加载。但这种方法可能导致过多的数据库连接,因此也...

    HibernateSpring多数据库解决方案.doc

    本方案主要探讨如何在基于Hibernate和Spring框架的环境中实现多数据库的管理,特别是在`OpenSessionInView`模式下的配置。 首先,我们看到在`applicationContext.xml`配置文件中定义了两个数据源,一个用于读操作...

    Hibernate延迟加载以及利用Spring

    4. **使用OpenSessionInView模式**:这是一种常用的做法,在Web请求开始时打开Session,在请求结束时关闭Session。这样可以在整个请求过程中安全地访问延迟加载的对象。 5. **自定义Session管理**:通过Spring管理...

    SSH整合 struts+hibernate+spring

    在软件开发领域,特别是Java Web开发中,Struts、Spring 和 Hibernate 被广泛地应用于构建复杂的应用程序。这三大框架各有所长,分别在不同的层面发挥作用。为了更好地利用这些框架的优势,开发者通常会采用SSH...

    Struts+Spring+Hibernate开发实例.pdf

    - **OpenSessionInView** 是Hibernate的一个重要概念,它允许在视图层打开一个Session,这样就可以在渲染视图的时候访问数据库。 - **get() 和 set() 方法** 用于对象属性的获取和设置,在文档中被用于封装实体类...

    SSH项目整合示例【OpenSessionInView】所用到的jar包

    OpenSessionInView(OSIV)模式是SSH整合中常见的一种优化策略,它在用户的一次HTTP请求过程中保持Hibernate Session,避免了多次打开和关闭Session,减少了N+1查询问题,提高了性能。 **Spring** 是一个全面的企业...

    Hibernate学习笔记

    监听器方面,Hibernate提供了自定义监听器和配置监听器的功能,用于监控Hibernate的事件,如session的创建和关闭等。 总的来说,Hibernate学习笔记涵盖了从基础到高级的多个方面,对于希望掌握Hibernate的开发者来...

    spring+spingmvc+hibernate整合总结

    OpenSessionInView过滤器在Web请求的整个生命周期内保持一个Hibernate Session,使得在视图渲染阶段也能访问到数据库对象,避免了懒加载异常。 五、配置文件 1. `jdbc.properties`:存放数据库连接信息,如URL、...

    SSH整合示例项目 hibernate5.2.3+struts2.5.2+spring4.3.3.zip

    在用户请求到达时开启一个数据库Session,在请求处理完后关闭Session。这样,整个请求生命周期内,数据库操作都可以在一个Session内完成,避免了可能出现的 LazyInitializationException。 在本项目中,SSH整合实现...

    struts+spring+hibernate面试题

    - `openSessionInView`模式是在Web层使用Filter打开和关闭Session,确保每个HTTP请求都有一个活跃的Session,以支持延迟加载。 6. Spring的事务管理: - 有两种方式:声明式事务(基于注解或XML配置)和编程式...

    hibernate优化

    在Web开发中,OpenSessionInView模式能有效解决这个问题,但也要注意避免长时间占用Session资源。 其次,【抓取粒度】的调整也是关键。粒度决定了导航关联关系时预加载的数据量。通过设置batch-size,可以控制一次...

    Spring提供的CharacterEncoding和OpenSessionInView功能

    在基于Hibernate或其他ORM框架的Spring应用中,由于HTTP请求的无状态性,一次数据库操作可能跨多个方法调用,这就需要数据库会话(Session)在整个请求处理过程中保持打开状态。`OpenSessionInViewFilter`就是为了...

Global site tag (gtag.js) - Google Analytics