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
分享到:
相关推荐
同时,需要注意的是,OpenSessionInView模式虽然方便,但也会带来潜在的问题,如事务边界不清晰和会话泄漏。因此,在实际应用中,应结合具体需求谨慎使用,并考虑使用更现代的解决方案,如Spring Data JPA的...
总结来说,`lazy="true"` 是一种有效的性能优化策略,但需要注意其与Web环境的兼容性问题,这时OSIV模式可以提供解决方案。然而,OSIV也存在潜在的问题,因此在实际应用中需要权衡利弊,合理设计数据模型和事务管理...
7. **配置OpenSessionInView模式**:在`web.xml`中配置`OpenSessionInViewFilter`,目的是解决在HTTP请求结束后才提交事务导致的懒加载问题。通过在视图渲染阶段保持数据库会话,可以确保所有延迟加载的数据都能正确...
Hibernate的缓存策略与openSessionInView模式** 缓存策略是Hibernate性能优化的关键,而`openSessionInView`模式则是在Web应用中实现一级缓存的有效手段。它通过在每个请求开始时打开一个`Session`,并在请求结束...
在使用Spring框架时,推荐采用OpenSessionInView模式,确保请求处理的整个过程中数据库会话保持打开。这样可以避免因事务过早关闭导致的懒加载问题,但需要注意不要在视图层进行大数据量的分页查询,以免内存溢出。 ...
本方案主要探讨如何在基于Hibernate和Spring框架的环境中实现多数据库的管理,特别是在`OpenSessionInView`模式下的配置。 首先,我们看到在`applicationContext.xml`配置文件中定义了两个数据源,一个用于读操作...
这样,Struts就可以调用Spring管理的bean来进行业务逻辑处理,实现MVC模式的松耦合设计。 #### 三、小结 Spring配置是搭建Spring应用的基础,涵盖了日志、环境配置、编码、事务管理等多个方面。熟练掌握这些配置...
- **OpenSessionInView**:是一种设计模式,用于Web应用中,通过过滤器在请求开始时打开`Session`,结束时关闭,确保整个请求过程中`Session`可用,从而支持延迟加载。但这种方法可能导致过多的数据库连接,因此也...
2. **预加载**:使用OpenSessionInView模式,避免因多次打开和关闭Session导致的性能损失。 3. **懒加载**:对于关联对象,可采用懒加载策略,减少数据加载量。 4. **动态SQL**:使用MyBatis或JPA等框架,可以方便...
传统的编程模式中,对象自己控制依赖关系的建立。而在IoC中,这种控制权反转,对象的依赖关系由外部容器(如Spring的IoC容器)进行管理和建立。这样,对象只需要关注自己的业务逻辑,而无需关心依赖对象的创建和管理...
在Web应用的配置文件Web.xml中,有两个重要的配置部分:一是OpenSessionInView(OSIV)模式,通过`OpenSessionInViewFilter`确保在每次HTTP请求中都保持一个有效的Hibernate Session,避免了懒加载异常。二是设置...
- 利用Spring提供的`OpenSessionInView`模式处理事务边界问题,确保每个HTTP请求都运行在一个独立的事务内。 - 在`web.xml`中配置`OpenSessionInViewFilter`过滤器,自动管理事务。 #### 三、总结 通过以上步骤...
5. **OpenSessionInView模式** - 修改`HibernateSessionFactory.java`,实现线程局部变量存储事务对象。 - 实现`beginTransaction`、`commitTransaction`、`rollbackTransaction`等方法,确保在每次请求结束时关闭...
下面是从笔记中总结的知识点: 1. 保证线程安全的三种方法:不要跨线程访问共享变量,使用final类型的共享变量,或者将共享变量的操作加上同步。 2. 在设计类时,应该从一开始就设计成线程安全的,而不是在后期...
- **Struts1:** 在 Struts1 中,Action 对象是单例模式的,这意味着所有的请求都共享同一个 Action 实例。因此,在 Struts1 中 Action 是**非线程安全**的。 - **Struts2:** 而在 Struts2 中,Action 对象对于每个...