`
sanfeng_chow
  • 浏览: 101597 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

OpenSessionInView模式总结

阅读更多

OpenSessionInView模式的起源:

OpenSessionInViewFilter是Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,直到这个请求结束,具体是通过一个Filter来实现的。
由于Hibernate引入了Lazy Load特性,使得脱离Hibernate的Session周期的对象如果再想通过getter方法取到其关联对象的值,Hibernate会抛出一个 LazyLoad的Exception。所以为了解决这个问题,Spring引入了这个Filter,使得Hibernate的Session的生命周期 变长。

 

一个简单的例子。

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain filterChain) throws IOException, ServletException {
			try{
					
					Session session=HibernateSessionFactoryUtils.getSession();
					request.setAttribute(HIBERNATE_SESSIN_KEY, session);
					log.debug("客户端请求开始,Hibernate Session已打开.........");
					filterChain.doFilter(request, response);
			}finally {
					Object obj=request.getAttribute(HIBERNATE_SESSIN_KEY);
					if(obj!=null&&obj instanceof Session){
						Session session=(Session)obj;
						session.close();
						log.debug("客户端请求结束,Hibernate Session已关闭.........");
					}else{
						log.error("客户端请求结束,Hibernate Session未发现,请检查代码....");
					}
				}
	}

 缺点:使用了OpenSessionInView 模式后造成了内存和数据库连接问题

由于使用了OpenSessionInView 模 式,Session的生命周期变得非常长。虽然解决了Lazy Load的问题,但是带来的问题就是Hibernate的一级缓存,也就是Session级别的缓存的生命周期会变得非常长,那么如果你在你的 Service层做大批量的数据操作时,其实这些数据会在缓存中保留一份,这是非常耗费内存的。还有一个数据库连接的问题,存在的原因在于由于数据库的 Connection是和Session绑在一起的,所以,Connection也会得不到及时的释放。因而当系统出现业务非常繁忙,而计算量又非常大的 时候,往往数据连接池的连接数会不够。这个问题我至今非常头痛,因为有很多客户对数据连接池的数量会有限制,不会给你无限制的增加下去。

在本地开发测试的时候没出现问题,但试想下如果流程中的某一步被阻塞的话,那在这期间connection就一直被占用而不释 放。最有可能被阻塞的就是在写Jsp这步,一方面可能是页面内容大,response.write的时间长,另一方面可能是网速慢,服务器与用户间传输时 间久。当大量这样的情况出现时,就有连接池连接不足,造成页面假死现象。

解决方案:

1,使用OpenSessionInView Interceptor来代替这个Filter

2,使用Hibernate.initialize()方法初始会延迟加载的对象

 

具体情况请看:http://www.iteye.com/topic/32001

 

http://www.iteye.com/topic/186068

 

分享到:
评论

相关推荐

    第30讲--Spring提供的CharacterEncoding和OpenSessionInView功能

    同时,需要注意的是,OpenSessionInView模式虽然方便,但也会带来潜在的问题,如事务边界不清晰和会话泄漏。因此,在实际应用中,应结合具体需求谨慎使用,并考虑使用更现代的解决方案,如Spring Data JPA的...

    spring中lazy=“true”的正常读取关联表(用opensessioninview)

    总结来说,`lazy="true"` 是一种有效的性能优化策略,但需要注意其与Web环境的兼容性问题,这时OSIV模式可以提供解决方案。然而,OSIV也存在潜在的问题,因此在实际应用中需要权衡利弊,合理设计数据模型和事务管理...

    搭建SSH框架总结.doc

    7. **配置OpenSessionInView模式**:在`web.xml`中配置`OpenSessionInViewFilter`,目的是解决在HTTP请求结束后才提交事务导致的懒加载问题。通过在视图渲染阶段保持数据库会话,可以确保所有延迟加载的数据都能正确...

    SSH面试总结(非常全)

    Hibernate的缓存策略与openSessionInView模式** 缓存策略是Hibernate性能优化的关键,而`openSessionInView`模式则是在Web应用中实现一级缓存的有效手段。它通过在每个请求开始时打开一个`Session`,并在请求结束...

    Hibernate分页总结

    在使用Spring框架时,推荐采用OpenSessionInView模式,确保请求处理的整个过程中数据库会话保持打开。这样可以避免因事务过早关闭导致的懒加载问题,但需要注意不要在视图层进行大数据量的分页查询,以免内存溢出。 ...

    HibernateSpring多数据库解决方案.doc

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

    Spring配置总结

    这样,Struts就可以调用Spring管理的bean来进行业务逻辑处理,实现MVC模式的松耦合设计。 #### 三、小结 Spring配置是搭建Spring应用的基础,涵盖了日志、环境配置、编码、事务管理等多个方面。熟练掌握这些配置...

    hibernate面试题总结

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

    SSH分页技术详解与实例

    2. **预加载**:使用OpenSessionInView模式,避免因多次打开和关闭Session导致的性能损失。 3. **懒加载**:对于关联对象,可采用懒加载策略,减少数据加载量。 4. **动态SQL**:使用MyBatis或JPA等框架,可以方便...

    面试知识点总结--spring面试题大全.pdf

    传统的编程模式中,对象自己控制依赖关系的建立。而在IoC中,这种控制权反转,对象的依赖关系由外部容器(如Spring的IoC容器)进行管理和建立。这样,对象只需要关注自己的业务逻辑,而无需关心依赖对象的创建和管理...

    SSH框架搭建.doc

    在Web应用的配置文件Web.xml中,有两个重要的配置部分:一是OpenSessionInView(OSIV)模式,通过`OpenSessionInViewFilter`确保在每次HTTP请求中都保持一个有效的Hibernate Session,避免了懒加载异常。二是设置...

    spring管理struts和hibernate

    - 利用Spring提供的`OpenSessionInView`模式处理事务边界问题,确保每个HTTP请求都运行在一个独立的事务内。 - 在`web.xml`中配置`OpenSessionInViewFilter`过滤器,自动管理事务。 #### 三、总结 通过以上步骤...

    SSH框架整合小册子

    5. **OpenSessionInView模式** - 修改`HibernateSessionFactory.java`,实现线程局部变量存储事务对象。 - 实现`beginTransaction`、`commitTransaction`、`rollbackTransaction`等方法,确保在每次请求结束时关闭...

    java并发编程实践笔记资料.pdf

    下面是从笔记中总结的知识点: 1. 保证线程安全的三种方法:不要跨线程访问共享变量,使用final类型的共享变量,或者将共享变量的操作加上同步。 2. 在设计类时,应该从一开始就设计成线程安全的,而不是在后期...

    java ssh 面试题

    - **Struts1:** 在 Struts1 中,Action 对象是单例模式的,这意味着所有的请求都共享同一个 Action 实例。因此,在 Struts1 中 Action 是**非线程安全**的。 - **Struts2:** 而在 Struts2 中,Action 对象对于每个...

Global site tag (gtag.js) - Google Analytics