OpenSessionInView会不会影响性能?

本文详细探讨了使用Spring的OpenSessionInViewFilter时可能遇到的问题,特别是在页面渲染速度慢的情况下,如何影响数据库连接和Session的生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.iteye.com/topic/17501?page=3

如果singleSession为true,那么Session会从请求开始,一直到页面生成结束、传输给用户才能关闭,这样的话,假如用户打开一个页面要15秒,那么这个Session也要持续15秒,数据库连接也占了15秒。。。 

如果是网络传输速度导致load页面需要15秒,那么时间消耗在网络传输上,本身页面执行时间很短。 


如果不是网络传输速度导致load页面需要15秒,那说明什么?说明这个页面的程序执行了15秒!为什么一个页面程序需要执行这么久呢?说明这个页面的数据库查询非常耗时!(纯内存操作都是ms级别的,如果都10多秒了,瓶颈只可能是数据库操作) 如果数据库查询需要15秒,请问你就算不用OpenSessionInView,你不是一样需要打开数据库连接长达15秒吗?

我写了一个简单的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)


其实我认为数据库连接被保持过长时间有时候会有很大的问题。尤其是对于采用数据连接池的情况,如果你的数据库连接一直被保持,那么这个资源就未被释放。假设说这个数据连接池的最大连接数为15,我感觉很容易造成数据库的连接不够用。 

按道理来说,数据库连接应该尽早被释放,以缓解数据库资源的压力,延迟很久才释放,确实会导致需要更多的数据库连接。这个就只能扩大连接池数量,增加数据库最大允许连接数来解决了。 

此外,Session被延迟很久释放,那么Session占用的一级缓存也会占用比较长时间,这意味着会无谓消耗更多的JVM内存。 

因此,OpenSessionInView虽然确实方便,但是大家还是慎用吧。对于那些页面渲染速度很慢,拨号连接用户数量过多的网站就最好不要使用。

无论怎么样的jsp都会被翻译成servlet 

而servlet被请求时会成成一个页面静态文件 
(本质上就是一个大字串,out.print("大字串内客")) 
openinview的数据库连接在生成页面文件后就关闭了。。。 

引用
对于那些页面 渲染速度很慢,

就是指这个大字串的生成过程时间很长的。。。。 




之后传到客户那里的过程用多少秒就不是占用数据库连接了。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值