论坛首页 Java企业应用论坛

spring3mvc与struts2比较

浏览 162466 次
该帖已经被评为良好帖
作者 正文
   发表时间:2010-04-18  
wen66 写道
引用

由于Struts2需要针对每个Request进行封装,把Request,Session等Servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全。所以在原则上,是比较耗费内存的。但是这个和高并发无关。主要是你的系统架构,让Struts2承担了过多的功能。 Struts2只应处理那些需要被应用服务器处理的请求。

至于导向到JSP,应经过Action中转,这个是基本编程原则。


不是的, 这和高并发有关系, 且是存在内存泄漏的情况, 因为在请求完成后, 我们用手动去gc它, 它的内存都不回收, 且发现大量占用老年堆的内存.

在我们的系统里没有让strut2承担过多的功能, 就只是让它进行请求的转发和参数的组装. 业务逻辑都放在spring管理的bean里面了. 如果经过action然后转向jsp, 这样你的并发性就上不去了. 因为了struts2的原因. 所以我们会在有些要求高并发的页面上,直接在jsp里调用spring管理的bean, 然后用jstl输出. 如果在性能有最高的要求的下, 我们会连jstl都不用. 直接用java代码来输出.

经过这个项目, 发现如果要应对高并发, 那还是回到jsp +javaBean的方式来上. 这样简单, 且不容易出错. 同时性能也好.


我认为你的测试应该存在问题。

从Struts2的源码上来看,一个请求所绑定的线程安全的ActionContext,的确比较大,这应该是Struts2比较耗费内存的原因。但是我不认为高并发,与性能有很大的关系。你们的老年堆的内存确定是Struts2带来的嘛?你怎么证明?

使用什么技术并不是解决高并发的原因。因为我们的程序的主结构都是Servlet,顶多是上面做点封装。所谓的高并发如果造成了性能问题,你所需要分析恐怕更多的是网络因素,而不是程序框架。当然,我不否认封装得越少越好,但是损失的是你从框架获得的好处。比如,参数的自动类型转化等。
0 请登录后投票
   发表时间:2010-04-18  
总体来说,struts2门槛要底点,用起来要顺手一些,
不过单论设计来看,springmvc要比struts2设计得好,思路很清晰,而且相对也稳定,struts2.0到现在不知道已经搞了多少补丁了,一个web框架用了几M的源码,一点都不精简,struts2的OGNL算是一个不错的东西,其它的好像并没多大亮点。
0 请登录后投票
   发表时间:2010-04-18   最后修改:2010-04-18
一说到性能 这话题就扯的没完了
就好比扯hibernate  几乎是月经帖

象下面那个hibernate不适合做大项目  直接搞了40页
0 请登录后投票
   发表时间:2010-04-19  
strut2要修改默认的拦截器链的配置。
0 请登录后投票
   发表时间:2010-04-19  
我还在用2.5MVC呢。
关注
0 请登录后投票
   发表时间:2010-04-19  
其实我觉得,对于struts2使用/*的,就不要说是struts2造成的性能问题。。。
使用validate方法验证的,不要说struts2的验证不好。
内存泄漏那这个能说得更详细点么?
0 请登录后投票
   发表时间:2010-04-19  
Agrael 写道
其实我觉得,对于struts2使用/*的,就不要说是struts2造成的性能问题。。。
使用validate方法验证的,不要说struts2的验证不好。
内存泄漏那这个能说得更详细点么?

to Agrael

在我做的测试里对struts2使用的是*.action, *.jsp, 没有用到你所说的/*

内存泄漏这个你只要写个jsp. 如http://localhost/myapp/my.jsp?para1=1&para2=2&para3=3. 在my.jsp里可以什么逻辑都不要, 只要输出这三个参数值就行. 然后使用road runner 在500用户下狂压20分钟看看。

当然我用的是struts2.1.6来做试验的.

在高版本下有没有解决这个问题就不知道了
0 请登录后投票
   发表时间:2010-04-19   最后修改:2010-04-19
Spring3 MVC 里面 有没有代替 Struts2 里面的 @ResultPath 的功能?
0 请登录后投票
   发表时间:2010-04-19   最后修改:2010-04-19
spring mvc 有一个问题 struts2中设置了
<constant name="struts.convention.result.path" value="/WEB-INF/content/" /> 
之后
auto_import=/WEB-INF/macros/admin/lib.ftl as csm 可以找到 lib.ftl

而在spring mvc中设置了
<property name="templateLoaderPath">
			<value>/WEB-INF/view/admin/</value>
		</property>

以后,auto_import的文件必须在/WEB-INF/view/admin/的子目录中,否则找不到文件

在struts2 中能通过 @ResultPath 设置多个 templateLoaderPath
在spring mvc中不能,但是这个在分为前台后台的系统中 比较有用因为 前台和后台再用不同的目录,

在struts2中能通过
@Namespace("/admin/")
来设置 而且这个属性能继承,对方法也有效这样能有利于,对url进行统一拦截,在springmvc中只能通过在方法上设置
@RequestMapping(value="/admin/login")
,比较繁琐,当然可以采取其他办法,必须放到admin 包下

struts2中还有个
引用
@package
,可以统一拦截等,而在springmvc中没有
0 请登录后投票
   发表时间:2010-04-19  
wen66 写道
Agrael 写道
其实我觉得,对于struts2使用/*的,就不要说是struts2造成的性能问题。。。
使用validate方法验证的,不要说struts2的验证不好。
内存泄漏那这个能说得更详细点么?

to Agrael

在我做的测试里对struts2使用的是*.action, *.jsp, 没有用到你所说的/*

内存泄漏这个你只要写个jsp. 如http://localhost/myapp/my.jsp?para1=1&para2=2&para3=3. 在my.jsp里可以什么逻辑都不要, 只要输出这三个参数值就行. 然后使用road runner 在500用户下狂压20分钟看看。

当然我用的是struts2.1.6来做试验的.

在高版本下有没有解决这个问题就不知道了



这位老兄能不能就测试过程及结果截一些图分享一下?

性能问题很尖锐,大家都比较关心。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics