慎用“OpenSessionInView”

最近一个线上项目在和第三方合作伙伴合作进行集成开发过程中,web.xml被加入了OpenSessionInViewFilter,由于在测试中压力较小,没有发现问题,结果在实际使用中出现了严重的性能问题。

OpenSessionInView是什么

OpenSessionInViewFilter是Spring提供的一个针对Hibernate的支持类,其主要意思是:当发起一个页面请求时,打开Hibernate的Session,并一直保持住这个Session,直到这个请求结束。具体是通过一个Filter来实现的。

为什么使用OpenSessionInView

当Hibernate+Spring配合使用的时候,如果设置了lazy=true,那么在读取数据的时候,当读取了父数据后,Hibernate会自动关闭Session,这样,当要使用子数据的时候,系统会抛出session already closed Exception或者 no session 的错误。

这时就需要使用Spring提供的OpenSessionInViewFilter,OpenSessionInViewFilter主要是保持Session状态直到request将全部信息发送到客户端,这样就可以解决延迟加载带来的问题。

当然这里的解决办法不光是只使用OpenSessionInViewFilter,也可以不使用,改用其他办法,这里是只说明第三方合作伙伴加入这个OpenSessionInViewFilter的原因。

使用OpenSessionInView的副作用

了解了上面两个问题,那么也就可以大概知道OpenSessionInView的副作用 – 资源占用严重,配置不当,影响系统性能。

使用OpenSessionInView后,在request发出和response返回的流程中,如果有任何一步被阻塞,那在这期间connection就会被一直占用而不释放。比如页面较大,显示需要时间 或者 网速太慢,服务器与用户间传输的时间太长,这都会导致资源占用,最直接的表现就是连接池连接不够用,而导致最终服务器无法提供服务。

推荐阅读:
1、http://www.iteye.com/topic/17501
2、http://www.iteye.com/topic/32001

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值