最近一个线上项目在和第三方合作伙伴合作进行集成开发过程中,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