锁定老帖子 主题:Spring MVC 性能提升
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-11-27
代码1:
在上面的例子中我们用ModelAndView的构造函数是public ModelAndView(String viewName, Map model),打开该构造函数的源码: 代码2
可以看出我们在java 代码1中创建的Map,在被提取值以后就没有什么用了。所以在Controller里面创建Map对象是冗余操作。 代码1应该如下写: 代码3
可是还是每次都要创建ModelAndView新实例,如果一个网站的日访问量是10万(当然,访问理大的网站都会考虑用静态页面的方法),那么一天这个JVM就要创建10万个ModelAndView实例。这样的开销就很大了。 一般的解决办法就是让ModelAndView能够循环利用,要想循环利用ModelAndView就要有一个Pool,在我们需要可以通过Pool.get方法来取出ModelAndView实例,在不需要时在调用Pool.release(ModelAndView)把它放回。需要进取出总是很好办的,问题在什么时候可以调用release方法来释放。解决这个问题只能看SpringMVC的源码,看看有没有解决办法。 最笨方法的就是顺藤摸瓜,每一个请求到来都要先到DispatchServlet的doService。打开源码找到这个方法,发现也没有什么了不起的地方,可是发现一个醒目的片段:
在doDispatch方法的前半部分是得到Controller返回的ModelAndView对象,后半部分是做显示处理,其中有这样一个显赫的代码段:
所以在render方法结束以后,再把ModelAndView对象放入缓存是正确的。我们可以继承DispatchServlet,然后把render方法重写,再用一个List作为简单的缓存池,实现如下: 代码4
代码5
代码6
整个下来,没有做太大的改到,也降低了开销。 还有一点要提醒一下,如果你用JSP做为页面,请不要用在ModelAndView的Map里放什么东西,这样Spring要做很多无用功,如果有东东全放入HttpServletRequest中,要想研究的话可以看看InternalResourceView的方法renderMergedOutputModel。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-11-27
Spring MVC总有取之不尽的东西,不爽的话都可以在某个点进行修正
|
|
返回顶楼 | |
发表时间:2007-11-27
引用 可是还是每次都要创建ModelAndView新实例,如果一个网站的日访问量是10万(当然,访问理大的网站都会考虑用静态页面的方法),那么一天这个JVM就要创建10万个ModelAndView实例。这样的开销就很大了。
晕,如果说每秒100万还可以算开销大。每天,你继续yy吧。。。 |
|
返回顶楼 | |
发表时间:2008-06-05
“那么一天这个JVM就要创建10万个ModelAndView实例。这样的开销就很大了。”
我开发机上new 10万个ModelAndView实例所花的时间不超过100ms,均摊到一天…… 反而是那段synchronized的代码,在实际环境中带来的性能损失是很可观的。不信,你可以自己做个测试,开他2000个线程,计算每个线程的平均执行时间。所以基本上这是捡芝麻丢西瓜... |
|
返回顶楼 | |
发表时间:2008-06-05
同意楼上的,同步做得不好的话开销更大,不知道本贴的楼主有没有做过真正的压力测试和性能测试,凭什么认为那样“重复利用MaV对象”就高效了,现代垃圾回收器可是比你想象的高效和稳定,我觉得不要凭感觉说话,还是做了测试之后再做性能改善,也学你的项目的性能瓶颈并不是想当然的在某个地方。
|
|
返回顶楼 | |
发表时间:2008-06-05
有点儿反其道而行之的感觉了
|
|
返回顶楼 | |
发表时间:2008-06-05
恩。new并不一定是性能的问题所在。要是按你的说法Struts2这类每次请求都要新建Action的框架要慢死的。
|
|
返回顶楼 | |
发表时间:2008-06-05
这完全是想当然式的优化
|
|
返回顶楼 | |
发表时间:2008-06-05
数据库用连接池有必要,这个没什么必要吧
synchronized 在大并发的情况下可能会引起排队情况 |
|
返回顶楼 | |
发表时间:2008-06-05
有时间花在这种无关痛痒的事情上面,还不如看看如何通过调整你Web服务器的配置参数来进行优化。
不懂,为什么很多人都无法找到问题的主要方面和次要方面。 |
|
返回顶楼 | |