我写了一个简单的webapp在Tomcat5.5.12上面做了一个小测试。在JSP页面里面循环1万次输出字符串,程序在远程服务器上面运行,网络是ADSL宽带,filter确实被阻塞了20秒左右。然后我另外开了一个flashget去下载服务器上的大文件,模拟网络速度比较慢的环境,filter被阻塞了50秒左右。分别做了三次测试。另外当页面下载过程中直接点击浏览器stop按钮,则JSP执行被打断,filter立刻解除阻塞,被执行完毕。
结论证明,使用OpenSessionInView的时候,如果render的页面数据量非常大,并且客户端网络速度很慢的情况下,由于页面的输出时间过程很长,确实会造成filter被长时间阻塞。对于OpenSessionInViewFilter来说,就会造成数据库连接被保持很长的时间,才能被关闭。
不过,对于Spring的OpenSessionInViewFilter来说,虽然数据库连接被保持了过长的时间,但是并没有锁定数据库资源,特别是事务资源。
因为Spring的事务是通过TransactionInterceptor来实现的,在MVC结构中,当最后一个业务bean被调用结束以后,Transaction就已经被提交了。此后,虽然数据库连接还保持中,但是数据库资源没有锁定问题。
完整的调用示意图:
request -> (OpenSessionInViewFilter打开Session) -> ServletDispatcher -> Action -> (打开Connection,启动事务) -> spring bean -> another spring bean -> (提交事务) -> bean执行完毕,返回Action -> render view(JSP/Template) -> (OpenSessionInViewFilter关闭Session和Connection)
分享到:
相关推荐
- **性能问题**:由于Session保持打开状态的时间较长,可能会导致更多的数据库连接占用,影响系统性能。 - **异常处理**:如果没有正确处理异常,可能导致Session没有被关闭,造成资源泄露。 #### 三、使用建议 1....
理解OpenSessionInView模式及其整合过程对Java Web开发者至关重要,它可以帮助优化数据访问性能,避免由于Session关闭引发的懒加载异常,提高应用程序的稳定性和用户体验。同时,注意合理配置和使用,以防止长时间...
为了练手培训,给大家准备的 Open Session In View 的简单例子,纯代码,大家可以参考,其中主要说了六部分内容: 1.通过接口编程 2.通过spring注入dao到 action 3.通过 open session in view filter 支持 延迟加载...
因为`Open Session In View`默认采用`FlushMode.NEVER`,这意味着Hibernate不会自动刷新session来同步数据库的变化。为了避免这个问题,可以采取以下几种解决办法: 1. **更改Flush Mode**:将`FlushMode`设置为`...
1. **性能问题**:由于Session在整个请求生命周期内保持开放,可能导致不必要的数据库锁定,影响并发性能。 2. **事务管理复杂**:OSIV可能会与事务边界混淆,使得事务管理变得复杂,尤其是在需要多个服务协作的场景...
同时,需要注意的是,OpenSessionInView模式虽然方便,但也会带来潜在的问题,如事务边界不清晰和会话泄漏。因此,在实际应用中,应结合具体需求谨慎使用,并考虑使用更现代的解决方案,如Spring Data JPA的...
OpenSessionInView(OSIV)模式是SSH整合中常见的一种优化策略,它在用户的一次HTTP请求过程中保持Hibernate Session,避免了多次打开和关闭Session,减少了N+1查询问题,提高了性能。 **Spring** 是一个全面的企业...
Spring框架是Java开发中不可或缺的一部分,它为开发者提供了丰富的功能,包括依赖注入、面向切面编程、事务管理等。在处理Web应用时,Spring提供了一些关键特性,如`CharacterEncodingFilter`和`...
2. **性能影响**:由于延长了Session的生命周期,可能会增加数据库连接的占用时间,从而影响性能。因此,对于大流量的网站,需要谨慎使用或寻找其他解决方案,如使用缓存。 3. **并发问题**:由于Session是绑定到...
通过在web.xml中配置`OpenSessionInViewFilter`,可以实现持久化层的事务与视图渲染的无缝结合,提高应用性能。 ##### 2. **Struts-config.xml与Spring集成** 当Spring与Struts框架集成时,可以通过`...
- **乐观锁**:假设不会发生并发冲突,仅在提交时检查版本号。 #### 其它问题 - **与JPA的集成**:Hibernate支持Java Persistence API标准,可以通过注解等方式与JPA集成。 - **监听器**:可以注册监听器来监听...
2. **预加载**:使用OpenSessionInView模式,避免因多次打开和关闭Session导致的性能损失。 3. **懒加载**:对于关联对象,可采用懒加载策略,减少数据加载量。 4. **动态SQL**:使用MyBatis或JPA等框架,可以方便...
在本项目中,SSH整合实现了OpenSessionInView,优化了数据访问性能,并保证了事务的一致性。通过合理配置,Spring能够管理Hibernate Session,使得在视图层(如JSP)仍能访问到数据库对象,而无需重新打开新的...
这种方式较为直观,但在大型项目中可能会显得冗余且难以维护。 #### 注解配置 随着Spring的发展,越来越多地使用注解来进行配置。这种方式更加简洁,同时也提高了代码的可读性和可维护性。 - **`@Autowired`**:...
这有助于提高性能,减少不必要的数据加载。 - **OpenSessionInView**: 通过Web层的Filter在一次请求周期内保持Session打开,确保所有延迟加载的属性能在Session关闭前完成加载。 #### 八、Spring事务管理 **问题:*...
因为同一个 Action 实例可能会被多个线程共享,导致并发访问时出现问题。 - **解决方案**: - 声明局部变量,避免在 Action 类中使用实例变量。 - 扩展 RequestProcessor,使得每次请求都会创建一个新的 Action ...
保持顺序会牺牲性能,而不保持顺序则可能导致消息乱序,需要根据实际需求权衡。 7. **乐观锁与悲观锁**: - 乐观锁假设冲突较少,只在更新时检查是否有其他线程修改,如版本号机制、时间戳等。悲观锁则在读取数据...
- **延迟加载**:在同一个`Session`范围内,只有当需要数据时才加载,以提高性能。 - **OpenSessionInView**:在Web层通过Filter保持`Session`在整个HTTP请求过程中的开放,确保延迟加载能够在正确范围内工作。 7...
因为同一个 Action 实例可能会被多个线程共享并同时访问。 - **保证 Action 线程安全的方法**: - 使用局部变量而非成员变量存储状态信息。 - 扩展 RequestProcessor,使得每次请求都会创建一个新的 Action 实例。...
以下是对面试中可能会遇到的Hibernate相关知识点的详细解释: 1. **load和get的区别**: - `load`方法是基于对象标识符(OID)来获取对象,它返回的是一个代理对象,实际的对象数据会在第一次访问属性时从数据库...