关于Struts的性能怀疑

03-12-04 layout
对于一个比较大型的项目采用Struts是否可取?
首先
1.actionservlet,如果使用Struts自身提供的Actionservlet的话,
是多个模块共用一个呢,还是对于不同的模块只是配置文件不同(moduleConfig)使用同一个ActionServlet呢?如果是对于不同的ActionServlet之间好像没有办法跳转.同一个ActionServlet会不
会造成瓶颈?(大量的访问堆积在ActionServlet层面,即使系统生
成了很多实例也恐怕不能够满足并发量400以上的访问?)
2.FormBean,FormBean的传递通常是通过request或者Session或者
context来进行的,这三种事实上都是存放一个映射关系,然后取出
来,都会涉及到对象的类型转换.这种转换在大量的并发操作下,会
造成资源的开销很大(从cpu和内存上面可以看得出来这种消耗,很
多内存不能及时回收..造成服务器的内存占用率斜线上升)
3.Action类的不灵活性.使用Action的时候如果不使用DispatchAction
的话,只能对应一个动作(submit)就需要一个Action类来对应处
理,这样子对于开发来说简直是一种灾难,拥有无数的只有一个
方法的类?同样的事情发生在FormBean上面.对于FormBean的DynaValidatorForm并不能真正解决问题,因为类型转换仍然频
繁发生.
4.严格按照Struts的规范而言是不是意味着两个jsp之间的所有通信(不包
括纯链接,带参数的在此范围内)都是通过ActionServlet和Action来发生
的?如果是的话,又会无端多出很多ForwardAction,虽然不需要手写,对于
ActionServlet来说压力又增加了,性能问题越发明显.

当然,以上只是一些个人意见,可能很多地方没有考虑得很清楚,希望大家一
起讨论讨论?

crogers
2003-12-04 23:50
如果项目规模不超过中国人均GDP最高的特区的OSS系统,那struts不会有问题

neutrino
2003-12-05 13:11
> 对于一个比较大型的项目采用Struts是否可取?
> 首先
> 1.actionservlet,如果使用Struts自身提供的Actionservlet?> 话,
> 是多个模块共用一个呢,还是对于不同的模块只是配置文件不?> (moduleConfig)使用同一个ActionServlet呢?如果是对于不同
> ActionServlet之间好像没有办法跳转.同一个ActionServlet
> 岵?> 会造成瓶颈?(大量的访问堆积在ActionServlet层面,即使系统
> ?> 成了很多实例也恐怕不能够满足并发量400以上的访问?)
很奇怪,你会说电脑就一个cpu造成瓶颈吗

> 2.FormBean,FormBean的传递通常是通过request或者Session?> 者
> context来进行的,这三种事实上都是存放一个映射关系,然后?> 出
> 来,都会涉及到对象的类型转换.这种转换在大量的并发操作下
> 会
> 造成资源的开销很大(从cpu和内存上面可以看得出来这种消耗
> 很
> 多内存不能及时回收..造成服务器的内存占用率斜线上升)
FormBean总在服务器端,不需要传递啊

> 3.Action类的不灵活性.使用Action的时候如果不使用Dispatc
> Action
> 的话,只能对应一个动作(submit)就需要一个Action类来对应?>
> 理,这样子对于开发来说简直是一种灾难,拥有无数的只有一个
>
> 方法的类?同样的事情发生在FormBean上面.对于FormBean的Dy
> aValidatorForm并不能真正解决问题,因为类型转换仍然频
> 繁发生.
对于每个请求Action和FormBen都是可选的

> 4.严格按照Struts的规范而言是不是意味着两个jsp之间的所?> 通信(不包
> 括纯链接,带参数的在此范围内)都是通过ActionServlet和Act
> on来发生
> 的?如果是的话,又会无端多出很多ForwardAction,虽然不需要
> 中?对于
> ActionServlet来说压力又增加了,性能问题越发明显.
不用担心ActionServlet
>
> 当然,以上只是一些个人意见,可能很多地方没有考虑得很清楚
> 希望大家一
> 起讨论讨论?

fromsun
2003-12-05 13:39
关于3:就算有dispatch actionservlet也不能从根本上解决问题,一个submit往往就是一种特定的操作和需求,必须有对应的code来处理,至于要写成action class这是没有办法的,framework这玩意就这样。

“大量的访问堆积在ActionServlet层面,即使系统生成了很多实例也恐怕不能够满足并发量400以上的访问?”
???
如果不能handle,那也不是actionservlet的问题,可能是cpu资源不够,其它关于性能的问题也是有一定道理的,framework往往把一个系统分割为多个“独立”的模块,相对于搞在一起性能上肯定是有牺牲的,但是不要忘了,老外的经典教条:速度不够用硬件弥补。

starfeng
2003-12-05 17:53
问题1:
一般是用同一个ActionServlet,当然你想用/abc/*.do对应ActionServlet1,/def/*.do对应ActionServlet2也可以

但是就算只用一个ActionServlet,但并不是说,Web服务器就只有一个线程在处量所有的请求,类和实例是不同的.

问题2:
关于大量的类型转换,类型转换是要一点时间,但那相对于业务的处理所要的时间来说可以计为零.而且,这里并没有大量的转换,无非,在由Form进Action的execute中,多了一次而已.

问题3:
>使用Action的时候如果不使用DispatchAction的话,..
那你就使用它就是了.

问题4:
>每个Action都会有ActionForward
这很正常啊,用户提交了他想要的操作,一般情况下,当然要给用户一个操作结果,JSP就是显示结果的地方,所以要Forward.
(当然Forward不一定只能到jsp)

layout
2003-12-05 20:56
1.对于只使用一个Servlet来统管,我不知道这种方式同使用不同的
servlet来做分流控制之间的主要差别在于什么?如果同样使用多线程
池的话应该没有太大区别,会无限创建实例吗?(如果没有空闲?)
2.对于不停的进行对象类型转换这种操作,少量的访问或者并发量不是
非常大的情况下可能还能够忍受,但是内存仍然会缓慢上扬.我在weblogic
下面做个比较详细的性能测试,在并发量50个的情况下10分钟就差不多
weblogic的内存上涨了200M左右(在这之后自动内存回收可以减少一些)
对于这种现象,我有理由对项目表示担心...
3.开发效率而言,让程序员不停的做基本类似的Action的类,总觉得是
一种很没有效率而且容易让程序员疲劳犯错的事情.即使采用了
DispatchAction依然存在繁琐的配置过程,如果在项目进度比较紧张的
情况下出现一个错误就足以影响整个进度....:P

只是对项目进度有些担心.同时我想请教请教各位大虾;
如果我对项目不是很有把握,而且团队组建还不是很久,对每个人的编码实
力都还不是很了解的情况下,使用struts来规范团队的开发(可能还有很大
一部分人对struts不是非常熟悉),这样能够减少项目风险吗?或者会更加
增加项目风险?

此外,有没有道友做过Struts的性能评测,就是比较正式严格的测试,不只是
象俺跑了10分钟的.用数据说话可能是最能够让人放心而且明确的方法.

layout
2003-12-05 20:58
对于一个并发量(同时访问数据库,或者说同时去点击一个按钮)在400
的情况下,兄台以为如何?(并发量一般同在线人数为1:10的关系)

starfeng
2003-12-05 21:35
问题1:
一般情况下就用一个ActionServlet,总控还是只有一个最好.
实例的多少由Web容器的调度策略来决定.
线程不会无限多下去,到了Web容器的极限的情形是:客户端到来的请求,Web容器不处理.

问题2:
内存上扬是正常现象,但这不是说用Struts才这样.
事实上从请求到ActionServlet开始记时,经过ActionForm转到excute方法,一般不会超过0.01s,(注:我开发机器用的是p4 1.5g ,600M内存,在wsal调试环境下.)

问题3:
用jbuilder 9做开发

crogers
2003-12-06 00:13
> 1.对于只使用一个Servlet来统管,我不知道这种方式同使用不
只有一个Servlet能够更好的进行控制和统计,而减少同步操作,或者线程冲突
> 2.对于不停的进行对象类型转换这种操作,少量的访问或者并?> 量不是
我们做测试的时候,wls开800M内存,5分钟就满,就会自动gc
gc完了以后,只有80M
关于内存大小,还是你自己写的代码是否干净的问题
干净的代码,自然有办法用更好的机器来gc,不干净的代码,再好也没用
> 3.开发效率而言,让程序员不停的做基本类似的Action的类,总
这个是项目自己的问题,和struts没关系,如果你没用struts,然后每人自己来写mvc,更加是一地错误
>
> 只是对项目进度有些担心.同时我想请教请教各位大虾;
> 如果我对项目不是很有把握,而且团队组建还不是很久,对每个
你是项目负责人,你应该自己足够清楚你的项目使用的技术结构
如果你不够清楚或者不够指导人,那就只有祈祷你的同事的技术水平
比如说,最基础的,你能控制好每个人机器上的开发运行环境都一样嘛?
>
> 此外,有没有道友做过Struts的性能评测,就是比较正式严格的
好像我已经回过了,不想再回了
想起一个基本原则:dupliation is terrible,嗯,灌水同样适用~


>对于一个并发量(同时访问数据库,或者说同时去点击一个按钮)在400
>的情况下,兄台以为如何?(并发量一般同在线人数为1:10的关系)
这倒可以答得出来,我们系统记录到得最大并发操作是300多,双机跑的,那对数据库来说应该有500多吧

richter
2003-12-27 10:49
小弟我用Robot+TestManager(rational的产品)测过我公司开发的商用系统(struts)(用的是发布版本)。具体数据记不清了。有一个统计用户使用频率的查询模块当并发超过400user时就当机了(当了Robot)

raymond323
2004-06-11 10:57
f

jeston2001
2004-06-13 15:57
gz

猜你喜欢