- 浏览: 1277025 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
最后的攻城狮:
这也太乱了
mybatis与spring事物处理日志 -
leo_soul:
现在不能跨1级域名了吧?比如www.aaa.com,www.b ...
Cookie跨域操作 -
zy976133:
怎么解决的
jaxws不支持SOAPBinding.Use.ENCODED -
cuiyaoqiang:
你好 开发一个http接口给fs调用 ,这个http接口是自己 ...
freeswitch 动态加载号码 -
Jackromer:
请问楼主知道如何通过主控方来删除与其有关的中间表记录? 谢谢, ...
hibernate 多对多只删除中间表数据
项目刚刚换了web层框架,放弃了struts2改用spring3mvc
当初还框架的时候目的比较单纯---springmvc支持rest,小生对restful url由衷的喜欢
不用不知道 一用就发现开发效率确实比struts2高
我们用struts2时采用的传统的配置文件的方式,并没有使用传说中的0配置
spring3 mvc可以认为已经100%零配置了(除了配置springmvc-servlet.xml外)
比较了一下strus2与spring3 mvc的差别
============================================
struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入
struts2实际上是通过setter getter方法与request打交道的
struts2中,一个Action对象对应一个request上下文
spring3 mvc不同,spring3mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去
在spring3mvc中,一个方法对应一个request上下文
好了 我们来整理一下
struts2是类级别的拦截, 一个类对应一个request上下文,
springmvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应
所以说从架构本身上 spring3 mvc就容易实现restful url
而struts2的架构实现起来要费劲
因为struts2 action的一个方法可以对应一个url
而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了
===================================
spring3mvc的方法之间基本上独立的,独享request response数据
请求数据通过参数获取,处理结果通过ModelMap交回给框架
方法之间不共享变量
而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的
这不会影响程序运行,却给我们编码 读程序时带来麻烦
====================================
spring3 mvc的验证也是一个亮点,支持JSR303
处理ajax的请求更是方便 只需一个注解@ResponseBody ,然后直接返回响应文本即可
附上一段代码
没有发现什么全局变量,请具体说明
sorry,实例变量
最近解除了一些webwork的遗留代码,发现action里经常是一大堆实例变量,被不同的方法读写,
当然你可以说这是开发人员的问题,但毕竟webwork更容易让人犯这样的错误,
springmvc的controller不是线程安全的,反而避免了这个问题。
Action的实例变量有什么问题?被不同的方法读写又有什么问题?我没有看到存在的问题。反而,有属性,也有方法的Java类才是面向对象的。一个连属性都没有的Java类,怎么说也OO不到哪里去。
另外就是你们在开发Action的时候,对Action的定义界定一定不是十分清楚。Struts2所期望的Action定义并不是将多数的操作都封装到一个Action里面。比如,你把所有的增删改查的业务操作全部放到一个Action里面,一定会造成Action中的实例变量多得无法维护。
Struts2的action虽然是线程安全的,但是设计时确实需要注意,一个action里面需要组合那些方法和实例变量。
一种做法是把对象相关的CRUD甚至其他方法和用到的变量全部放在Action里面。
好处:
1.实现快速。
缺陷:
1.同一个cusId在多个方法里面被用到,而且可能在不同方法里面有不同含义,也不知道是用于输入还是输出。
2.每次调用会生成无用的instance variable, 比如cusList.
随着这个类功能不断增加,实例变量的混乱使用不可避免,每次对象的生成也将更慢。
我个人认为以上做法甚至是反OO的,因为没有做到很好的职责分离。
我的建议是按页面划分action,或者按功能划分action.
按功能划分action
优点:
结构清晰。Action重用性强。
缺点:
类太多。
按页面划分action
优点:
结构清晰,实例变量和方法易于理解。
缺点:
和页面耦合严重,action重用性差。
我个人喜欢最后一种。
注解和性能没有关系,Servlet的生命周期是这样的,在调用这个Servlet时候才创建这个Servlet的类并运行init()方法,然后另外有人运行这个Servlet的时候并没有重启创建Servlet和运行里边的init()方法,所以Servlet容器时单利的,spring就是Servlet的封装的框架,包括所有的依赖注入都是在tomcat启动的时候全部被初始化的,其他的注解也一样,也就是说注解也就是以前的xml的配置的替代,以前没个请求都要运行一次xml吗?并不是的,xml是在tomcat启动时就读一次而已并利用里边的配置初始化很多的东西,然后就不在使用了,因为都成了单利的,这样就保证了效率,不是每次都把我们要注入的全部new一次,而是tomcat启动的时候全部new一次以后就不new了,保证了效率问题。
所以我不明白那个 光看注解就知道性能不好?
注解就是替代了xml配置而已,而且也是初始化一次,也就是说和编写Servlet一样的在init()中做了很多的事而已,并且以后不会在运行init()了,除非你重启tomcat。
struts1也一样,运行一个action的方法的时候创建一个action类,以后再运行就不会创建了,其实也是Servlet的封装的框架。
struts2特殊一些,没个请求要new一个action来保证线程安全。所以效率会低一些,但是不会低的特别离谱。
这样也说明了spring3的mvc和struts1的mvc还有Servlet都是方法的线程安全,所以在类方法声明的私有或者公有变量不是线程安全的,struts2的确实是线程安全的。
所有各有各的好处,用什么当然是仁者见仁智者见智了。
不过我们确实在新项目中大量的使用了spring3,因为REST挺好的。
没有发现什么全局变量,请具体说明
sorry,实例变量
最近解除了一些webwork的遗留代码,发现action里经常是一大堆实例变量,被不同的方法读写,
当然你可以说这是开发人员的问题,但毕竟webwork更容易让人犯这样的错误,
springmvc的controller不是线程安全的,反而避免了这个问题。
Action的实例变量有什么问题?被不同的方法读写又有什么问题?我没有看到存在的问题。反而,有属性,也有方法的Java类才是面向对象的。一个连属性都没有的Java类,怎么说也OO不到哪里去。
另外就是你们在开发Action的时候,对Action的定义界定一定不是十分清楚。Struts2所期望的Action定义并不是将多数的操作都封装到一个Action里面。比如,你把所有的增删改查的业务操作全部放到一个Action里面,一定会造成Action中的实例变量多得无法维护。
没有发现什么全局变量,请具体说明
sorry,实例变量
最近解除了一些webwork的遗留代码,发现action里经常是一大堆实例变量,被不同的方法读写,
当然你可以说这是开发人员的问题,但毕竟webwork更容易让人犯这样的错误,
springmvc的controller不是线程安全的,反而避免了这个问题。
1.最早的servlet就是线程不安全的,一般不能使用实例变量。
2.你碰到的案例完全就是遗留代码自身的编程问题,和框架没什么关系吧。说穿了就是action这一级逻辑代码的分布问题,是放在一个class中、or根据逻辑再拆分到不同的class(action)而已。
3.struts2的框架允许自定义某个action是单例(非线程安全)还是多例的,用注解或配置文件很容易设置的。
没有发现什么全局变量,请具体说明
sorry,实例变量
最近解除了一些webwork的遗留代码,发现action里经常是一大堆实例变量,被不同的方法读写,
当然你可以说这是开发人员的问题,但毕竟webwork更容易让人犯这样的错误,
springmvc的controller不是线程安全的,反而避免了这个问题。
没有发现什么全局变量,请具体说明
我用的是loadrunner进行测试的, 应该不会存在你所说的cookie的问题, servlet容量用的是tomcat6. 如果是tomcat对session管理的问题, 那么在spring3的那个例子里, 应该也会占用那么高的内存, 而事实上却没有出现这样的情况. 只在struts2的那个例子里出现了. 对了, 说一下, 我用的strut2的版本是2.0.11
恰恰我觉得是会, 从你的回复得知你应该没有对loadrunner做什么cookie方面的配置, 只要没有sessionId过去, struts2会为每次请求都调用httpservletrequest.getSession(true);这表示如果请求中不带sessionid,也找不到这个请求的session, 那就为这个请求创建一个session.所以如果你的loadrunner没有做相应的cookie的设置,那么struts2.0+tomcat的时候大量的session就产生了。
而spring mvc之所以没有出现这个问题, 是因为spring mvc应该没有主动在框架里调用httpservletrequest.getSession(true);这个方法, 所以如果你不手动调用这个方法的话, spring+tomcat的环境下, 即使你的请求中不带sessionid, 那么也不回出现大量的session在ConcurrentHashMap中的情况。
你测试的时候有没有加cookie管理器(我假设你用jmeter, 因为你并没有说你是使用什么工具进行测试的)?
如果不加的话, 那么每次请求tomcat(我假设你用tomcat, 因为你没有说你用什么servlet容器)都会创建一个httpsession, tomcat中的实现类为StandardSession,这个对象又会放到StandardManager里的一个叫做sessions的变量里, sessions是一个ConcurrentHashMap, StandardSession里放attribute的又是一个ConcurrentHashMap, 所以如果你没有加cookie就请求30w次, 那么你就产生了30w个StandardSession对象, 每个StandardSession里有一个ConcurrentHashMap, 也就是说会产生30w个ConcurrentHashMap. ConcurrentHashMap使用的是锁分离技术, 一个ConcurrentHashMap里有16个segment(一个segment是一把lock), 那也是什么java.util.concurrent.locks占用了大量的内存的原因.
所以这个并不是struts2.0有问题(为每个cookie中没有sessionid的请求都创建一个httpsession的行为也不能说是一个什么严重的问题), 而是你的测试有问题. 你只要加上cookie来测试(jsessionid在cookie里), 你就不会有这么多StandardSession对象了, 进而也不会有那么多ConcurrentHashMap, 也不会有那么多lock. 也不会占那么多内存.
所以据我推断, 应该是你的测试方法有问题, 而并非是struts2.0有问题, 还有struts2里貌似也没有DispatchServlet这个类.
我用的是loadrunner进行测试的, 应该不会存在你所说的cookie的问题, servlet容量用的是tomcat6. 如果是tomcat对session管理的问题, 那么在spring3的那个例子里, 应该也会占用那么高的内存, 而事实上却没有出现这样的情况. 只在struts2的那个例子里出现了. 对了, 说一下, 我用的strut2的版本是2.0.11
你测试的时候有没有加cookie管理器(我假设你用jmeter, 因为你并没有说你是使用什么工具进行测试的)?
如果不加的话, 那么每次请求tomcat(我假设你用tomcat, 因为你没有说你用什么servlet容器)都会创建一个httpsession, tomcat中的实现类为StandardSession,这个对象又会放到StandardManager里的一个叫做sessions的变量里, sessions是一个ConcurrentHashMap, StandardSession里放attribute的又是一个ConcurrentHashMap, 所以如果你没有加cookie就请求30w次, 那么你就产生了30w个StandardSession对象, 每个StandardSession里有一个ConcurrentHashMap, 也就是说会产生30w个ConcurrentHashMap. ConcurrentHashMap使用的是锁分离技术, 一个ConcurrentHashMap里有16个segment(一个segment是一把lock), 那也是什么java.util.concurrent.locks占用了大量的内存的原因.
所以这个并不是struts2.0有问题(为每个cookie中没有sessionid的请求都创建一个httpsession的行为也不能说是一个什么严重的问题), 而是你的测试有问题. 你只要加上cookie来测试(jsessionid在cookie里), 你就不会有这么多StandardSession对象了, 进而也不会有那么多ConcurrentHashMap, 也不会有那么多lock. 也不会占那么多内存.
所以据我推断, 应该是你的测试方法有问题, 而并非是struts2.0有问题, 还有struts2里貌似也没有DispatchServlet这个类.
是不是真的哟,不要吓我撒!
默认拦截器应该精简一下,把不用的拦截器去掉即可。
是不是真的哟,不要吓我撒!
而在spring3的mvc下(restful), 会存在一个问题就是, 如果我要直接转向我的 http://localhost/myapp/model1/my.jsp 时如果我不在mvc配制文件下配制下配制, 那它怎么进行转向, 这也是一个问题. 也就是说我增加一个jsp, 还要改配制文件, 这很烦啊. 或者说是我没有发现有别的方法可做, 请大家指教.
也可以redirect一个请求。
这个确实是,而且seam在某些应用里面有很大的优势,比如一些传统的管理系统项目,我最不爽的的是JSF,做B/S出生的人估计没几个喜欢那套呆板难用的jsf组件。
深恶痛绝
当初还框架的时候目的比较单纯---springmvc支持rest,小生对restful url由衷的喜欢
不用不知道 一用就发现开发效率确实比struts2高
我们用struts2时采用的传统的配置文件的方式,并没有使用传说中的0配置
spring3 mvc可以认为已经100%零配置了(除了配置springmvc-servlet.xml外)
比较了一下strus2与spring3 mvc的差别
============================================
struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入
struts2实际上是通过setter getter方法与request打交道的
struts2中,一个Action对象对应一个request上下文
spring3 mvc不同,spring3mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去
在spring3mvc中,一个方法对应一个request上下文
好了 我们来整理一下
struts2是类级别的拦截, 一个类对应一个request上下文,
springmvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应
所以说从架构本身上 spring3 mvc就容易实现restful url
而struts2的架构实现起来要费劲
因为struts2 action的一个方法可以对应一个url
而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了
===================================
spring3mvc的方法之间基本上独立的,独享request response数据
请求数据通过参数获取,处理结果通过ModelMap交回给框架
方法之间不共享变量
而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的
这不会影响程序运行,却给我们编码 读程序时带来麻烦
====================================
spring3 mvc的验证也是一个亮点,支持JSR303
处理ajax的请求更是方便 只需一个注解@ResponseBody ,然后直接返回响应文本即可
附上一段代码
@RequestMapping(value="/whitelists") public String index(ModelMap map){ Account account = accountManager.getByDigitId(SecurityContextHolder.get().getDigitId()) ; List<Group> groupList = groupManager.findAllGroup(account.getId()) ; map.put("account", account); map.put("groupList", groupList); return "/group/group-index" ; } //@ResponseBody ajax响应 @RequestMapping(value="/whitelist/{whiteListId}/del") @ResponseBody public String delete(@PathVariable Integer whiteListId){ whiteListManager.deleteWhiteList(whiteListId) ; return "success" ; }
评论
86 楼
slaser
2010-06-23
downpour 写道
daquan198163 写道
downpour 写道
daquan198163 写道
webwork和struts2的action很容易全局变量泛滥,目前正在深受其害
没有发现什么全局变量,请具体说明
sorry,实例变量
最近解除了一些webwork的遗留代码,发现action里经常是一大堆实例变量,被不同的方法读写,
当然你可以说这是开发人员的问题,但毕竟webwork更容易让人犯这样的错误,
springmvc的controller不是线程安全的,反而避免了这个问题。
Action的实例变量有什么问题?被不同的方法读写又有什么问题?我没有看到存在的问题。反而,有属性,也有方法的Java类才是面向对象的。一个连属性都没有的Java类,怎么说也OO不到哪里去。
另外就是你们在开发Action的时候,对Action的定义界定一定不是十分清楚。Struts2所期望的Action定义并不是将多数的操作都封装到一个Action里面。比如,你把所有的增删改查的业务操作全部放到一个Action里面,一定会造成Action中的实例变量多得无法维护。
Struts2的action虽然是线程安全的,但是设计时确实需要注意,一个action里面需要组合那些方法和实例变量。
一种做法是把对象相关的CRUD甚至其他方法和用到的变量全部放在Action里面。
class CustomerAction{ private String cusId; private String toCusId; private Customer cus; private List<Customer> cusList; //use cusList as result. public String search(){ ... } //use cus as result, cusId as input. public String load(){ cus = service.load(cusId); } //use cus as input. public void create(){ ... } //use cusId, toCusId as input public void copy(){ ... } //other method. ... }
好处:
1.实现快速。
缺陷:
1.同一个cusId在多个方法里面被用到,而且可能在不同方法里面有不同含义,也不知道是用于输入还是输出。
2.每次调用会生成无用的instance variable, 比如cusList.
随着这个类功能不断增加,实例变量的混乱使用不可避免,每次对象的生成也将更慢。
我个人认为以上做法甚至是反OO的,因为没有做到很好的职责分离。
我的建议是按页面划分action,或者按功能划分action.
按功能划分action
class CustomerCreateAction{ private Customer cus; //use cus as input. public void create(){ ... } }
优点:
结构清晰。Action重用性强。
缺点:
类太多。
按页面划分action
class CustomerEditPageAction{ //对应页面编辑的cus对象。 private Customer cus; //对应客户列表。 private List cusList; //对应创建按钮事件. public void create(){ ... } }
优点:
结构清晰,实例变量和方法易于理解。
缺点:
和页面耦合严重,action重用性差。
我个人喜欢最后一种。
85 楼
huangguan18
2010-06-22
zdmcjm 写道
to wen66
不用做压力测试也知道啦,光看@Name这种运行时注解就知道,他的性能不会好到哪,再看到他的动态注入方式,还双向,更加不要对他的性能抱希望啦。所以我说悲哀啊,seam是在正确的使用java,但是。。。
不用做压力测试也知道啦,光看@Name这种运行时注解就知道,他的性能不会好到哪,再看到他的动态注入方式,还双向,更加不要对他的性能抱希望啦。所以我说悲哀啊,seam是在正确的使用java,但是。。。
注解和性能没有关系,Servlet的生命周期是这样的,在调用这个Servlet时候才创建这个Servlet的类并运行init()方法,然后另外有人运行这个Servlet的时候并没有重启创建Servlet和运行里边的init()方法,所以Servlet容器时单利的,spring就是Servlet的封装的框架,包括所有的依赖注入都是在tomcat启动的时候全部被初始化的,其他的注解也一样,也就是说注解也就是以前的xml的配置的替代,以前没个请求都要运行一次xml吗?并不是的,xml是在tomcat启动时就读一次而已并利用里边的配置初始化很多的东西,然后就不在使用了,因为都成了单利的,这样就保证了效率,不是每次都把我们要注入的全部new一次,而是tomcat启动的时候全部new一次以后就不new了,保证了效率问题。
所以我不明白那个 光看注解就知道性能不好?
注解就是替代了xml配置而已,而且也是初始化一次,也就是说和编写Servlet一样的在init()中做了很多的事而已,并且以后不会在运行init()了,除非你重启tomcat。
struts1也一样,运行一个action的方法的时候创建一个action类,以后再运行就不会创建了,其实也是Servlet的封装的框架。
struts2特殊一些,没个请求要new一个action来保证线程安全。所以效率会低一些,但是不会低的特别离谱。
这样也说明了spring3的mvc和struts1的mvc还有Servlet都是方法的线程安全,所以在类方法声明的私有或者公有变量不是线程安全的,struts2的确实是线程安全的。
所有各有各的好处,用什么当然是仁者见仁智者见智了。
不过我们确实在新项目中大量的使用了spring3,因为REST挺好的。
84 楼
downpour
2010-06-16
daquan198163 写道
downpour 写道
daquan198163 写道
webwork和struts2的action很容易全局变量泛滥,目前正在深受其害
没有发现什么全局变量,请具体说明
sorry,实例变量
最近解除了一些webwork的遗留代码,发现action里经常是一大堆实例变量,被不同的方法读写,
当然你可以说这是开发人员的问题,但毕竟webwork更容易让人犯这样的错误,
springmvc的controller不是线程安全的,反而避免了这个问题。
Action的实例变量有什么问题?被不同的方法读写又有什么问题?我没有看到存在的问题。反而,有属性,也有方法的Java类才是面向对象的。一个连属性都没有的Java类,怎么说也OO不到哪里去。
另外就是你们在开发Action的时候,对Action的定义界定一定不是十分清楚。Struts2所期望的Action定义并不是将多数的操作都封装到一个Action里面。比如,你把所有的增删改查的业务操作全部放到一个Action里面,一定会造成Action中的实例变量多得无法维护。
83 楼
icewubin
2010-06-16
daquan198163 写道
downpour 写道
daquan198163 写道
webwork和struts2的action很容易全局变量泛滥,目前正在深受其害
没有发现什么全局变量,请具体说明
sorry,实例变量
最近解除了一些webwork的遗留代码,发现action里经常是一大堆实例变量,被不同的方法读写,
当然你可以说这是开发人员的问题,但毕竟webwork更容易让人犯这样的错误,
springmvc的controller不是线程安全的,反而避免了这个问题。
1.最早的servlet就是线程不安全的,一般不能使用实例变量。
2.你碰到的案例完全就是遗留代码自身的编程问题,和框架没什么关系吧。说穿了就是action这一级逻辑代码的分布问题,是放在一个class中、or根据逻辑再拆分到不同的class(action)而已。
3.struts2的框架允许自定义某个action是单例(非线程安全)还是多例的,用注解或配置文件很容易设置的。
82 楼
daquan198163
2010-06-16
downpour 写道
daquan198163 写道
webwork和struts2的action很容易全局变量泛滥,目前正在深受其害
没有发现什么全局变量,请具体说明
sorry,实例变量
最近解除了一些webwork的遗留代码,发现action里经常是一大堆实例变量,被不同的方法读写,
当然你可以说这是开发人员的问题,但毕竟webwork更容易让人犯这样的错误,
springmvc的controller不是线程安全的,反而避免了这个问题。
81 楼
downpour
2010-06-16
daquan198163 写道
webwork和struts2的action很容易全局变量泛滥,目前正在深受其害
没有发现什么全局变量,请具体说明
80 楼
daquan198163
2010-06-16
webwork和struts2的action很容易全局变量泛滥,目前正在深受其害
79 楼
downpour
2010-06-16
谢谢ahuaxuan的测试。不过我查看了一下Struts2中的源码,没有显示调用createSession(true)的代码。
所以除非Struts2中有显示调用put的代码,否则恐怕不会去调用createSession(true)的代码。
/** * Creates a new session map given a http servlet request. Note, ths enumeration of request * attributes will occur when the map entries are asked for. * * @param request the http servlet request object. */ public SessionMap(HttpServletRequest request) { // note, holding on to this request and relying on lazy session initalization will not work // if you are running your action invocation in a background task, such as using the // "execAndWait" interceptor this.request = request; this.session = request.getSession(false); } /** * Saves an attribute in the session. * * @param key the name of the session attribute. * @param value the value to set. * @return the object that was just set. */ public V put(K key, V value) { synchronized (this) { if (session == null) { session = request.getSession(true); } } synchronized (session) { entries = null; session.setAttribute(key.toString(), value); return get(key); } }
所以除非Struts2中有显示调用put的代码,否则恐怕不会去调用createSession(true)的代码。
78 楼
ahuaxuan
2010-06-16
wen66 写道
我用的是loadrunner进行测试的, 应该不会存在你所说的cookie的问题, servlet容量用的是tomcat6. 如果是tomcat对session管理的问题, 那么在spring3的那个例子里, 应该也会占用那么高的内存, 而事实上却没有出现这样的情况. 只在struts2的那个例子里出现了. 对了, 说一下, 我用的strut2的版本是2.0.11
恰恰我觉得是会, 从你的回复得知你应该没有对loadrunner做什么cookie方面的配置, 只要没有sessionId过去, struts2会为每次请求都调用httpservletrequest.getSession(true);这表示如果请求中不带sessionid,也找不到这个请求的session, 那就为这个请求创建一个session.所以如果你的loadrunner没有做相应的cookie的设置,那么struts2.0+tomcat的时候大量的session就产生了。
而spring mvc之所以没有出现这个问题, 是因为spring mvc应该没有主动在框架里调用httpservletrequest.getSession(true);这个方法, 所以如果你不手动调用这个方法的话, spring+tomcat的环境下, 即使你的请求中不带sessionid, 那么也不回出现大量的session在ConcurrentHashMap中的情况。
77 楼
wen66
2010-06-16
ahuaxuan 写道
wen66 写道
spring3与struts2有很大的区别, 最近我们在struts2.1及spring3.0.2上做过压力测试, 发现struts2.1在默认的配制下存在严重的性能问题. 每秒的点击数不会超过200, 而如果用struts2的dispatchServlet去拦截带有参数的jsp如(http://localhost/myapp/my.jsp?para1=1¶2=2) 这样的url时, 在大并发时, 存在很严重的内存泄漏的问题. 用jprofile可以发现java.util.concurrent.concurrenthashmap占用了大量的内存, 同时java.util.concurrent.locks也占用了大量的内存. 原因估计为struts2里面的参数转化拦截器出了问题(没有得到求证).
你测试的时候有没有加cookie管理器(我假设你用jmeter, 因为你并没有说你是使用什么工具进行测试的)?
如果不加的话, 那么每次请求tomcat(我假设你用tomcat, 因为你没有说你用什么servlet容器)都会创建一个httpsession, tomcat中的实现类为StandardSession,这个对象又会放到StandardManager里的一个叫做sessions的变量里, sessions是一个ConcurrentHashMap, StandardSession里放attribute的又是一个ConcurrentHashMap, 所以如果你没有加cookie就请求30w次, 那么你就产生了30w个StandardSession对象, 每个StandardSession里有一个ConcurrentHashMap, 也就是说会产生30w个ConcurrentHashMap. ConcurrentHashMap使用的是锁分离技术, 一个ConcurrentHashMap里有16个segment(一个segment是一把lock), 那也是什么java.util.concurrent.locks占用了大量的内存的原因.
所以这个并不是struts2.0有问题(为每个cookie中没有sessionid的请求都创建一个httpsession的行为也不能说是一个什么严重的问题), 而是你的测试有问题. 你只要加上cookie来测试(jsessionid在cookie里), 你就不会有这么多StandardSession对象了, 进而也不会有那么多ConcurrentHashMap, 也不会有那么多lock. 也不会占那么多内存.
所以据我推断, 应该是你的测试方法有问题, 而并非是struts2.0有问题, 还有struts2里貌似也没有DispatchServlet这个类.
我用的是loadrunner进行测试的, 应该不会存在你所说的cookie的问题, servlet容量用的是tomcat6. 如果是tomcat对session管理的问题, 那么在spring3的那个例子里, 应该也会占用那么高的内存, 而事实上却没有出现这样的情况. 只在struts2的那个例子里出现了. 对了, 说一下, 我用的strut2的版本是2.0.11
76 楼
ahuaxuan
2010-06-16
wen66 写道
spring3与struts2有很大的区别, 最近我们在struts2.1及spring3.0.2上做过压力测试, 发现struts2.1在默认的配制下存在严重的性能问题. 每秒的点击数不会超过200, 而如果用struts2的dispatchServlet去拦截带有参数的jsp如(http://localhost/myapp/my.jsp?para1=1¶2=2) 这样的url时, 在大并发时, 存在很严重的内存泄漏的问题. 用jprofile可以发现java.util.concurrent.concurrenthashmap占用了大量的内存, 同时java.util.concurrent.locks也占用了大量的内存. 原因估计为struts2里面的参数转化拦截器出了问题(没有得到求证).
你测试的时候有没有加cookie管理器(我假设你用jmeter, 因为你并没有说你是使用什么工具进行测试的)?
如果不加的话, 那么每次请求tomcat(我假设你用tomcat, 因为你没有说你用什么servlet容器)都会创建一个httpsession, tomcat中的实现类为StandardSession,这个对象又会放到StandardManager里的一个叫做sessions的变量里, sessions是一个ConcurrentHashMap, StandardSession里放attribute的又是一个ConcurrentHashMap, 所以如果你没有加cookie就请求30w次, 那么你就产生了30w个StandardSession对象, 每个StandardSession里有一个ConcurrentHashMap, 也就是说会产生30w个ConcurrentHashMap. ConcurrentHashMap使用的是锁分离技术, 一个ConcurrentHashMap里有16个segment(一个segment是一把lock), 那也是什么java.util.concurrent.locks占用了大量的内存的原因.
所以这个并不是struts2.0有问题(为每个cookie中没有sessionid的请求都创建一个httpsession的行为也不能说是一个什么严重的问题), 而是你的测试有问题. 你只要加上cookie来测试(jsessionid在cookie里), 你就不会有这么多StandardSession对象了, 进而也不会有那么多ConcurrentHashMap, 也不会有那么多lock. 也不会占那么多内存.
所以据我推断, 应该是你的测试方法有问题, 而并非是struts2.0有问题, 还有struts2里貌似也没有DispatchServlet这个类.
75 楼
wj131
2010-06-10
拜读spring3的mvc
74 楼
aibozeng
2010-06-05
最近有新项目(企业应用的,非网站运营类),web端在考虑使用struts2还是spring mvc 。以前的项目用过 struts2 和 GWT 。
(1) JSF:肯定是不用. 06年时考察过jsf,一看页面所有组件的对象生命周期都由服务器端维护,一想,老外就是牛逼,服务器配置真高,否则那敢想这方面的事件驱动?而我们的服务器可没有这么好。当时seam还没有成熟版本发布。
(2)GWT: 由于业务操作复杂,一个页面需要处理很多树,就使用了富客户端中的 GWT技术。用了两年。编译打包问题太大,项目业务界面不复杂了,不想继续用了。
(3)Struts2:用了两年了,没有发现什么大问题。
(4)Spring MVC: 既然WEB端Action管理使用了Spring,那就一套,页面流部分也使用 Spring 带的MVC好了。 其实 struts2和spring mvc没有什么差别。要想系统跑得棒,那些拦截器、过滤器、AOP什么之类的,最好少用。否则,又懒写代码,又想性能好,天底下有这么免费的好事?
等我再使用半年 spring mvc ,看看什么情况。
(1) JSF:肯定是不用. 06年时考察过jsf,一看页面所有组件的对象生命周期都由服务器端维护,一想,老外就是牛逼,服务器配置真高,否则那敢想这方面的事件驱动?而我们的服务器可没有这么好。当时seam还没有成熟版本发布。
(2)GWT: 由于业务操作复杂,一个页面需要处理很多树,就使用了富客户端中的 GWT技术。用了两年。编译打包问题太大,项目业务界面不复杂了,不想继续用了。
(3)Struts2:用了两年了,没有发现什么大问题。
(4)Spring MVC: 既然WEB端Action管理使用了Spring,那就一套,页面流部分也使用 Spring 带的MVC好了。 其实 struts2和spring mvc没有什么差别。要想系统跑得棒,那些拦截器、过滤器、AOP什么之类的,最好少用。否则,又懒写代码,又想性能好,天底下有这么免费的好事?
等我再使用半年 spring mvc ,看看什么情况。
73 楼
香烟与酒
2010-05-10
楼主可以提供点资料吗?比如做好的简单项目啊!还有些关于这方面的资料!
72 楼
icewubin
2010-05-08
小刘而已 写道
wen66 写道
spring3与struts2有很大的区别, 最近我们在struts2.1及spring3.0.2上做过压力测试, 发现struts2.1在默认的配制下存在严重的性能问题. 每秒的点击数不会超过200, 而如果用struts2的dispatchServlet去拦截带有参数的jsp如(http://localhost/myapp/my.jsp?para1=1¶2=2) 这样的url时, 在大并发时, 存在很严重的内存泄漏的问题. 用jprofile可以发现java.util.concurrent.concurrenthashmap占用了大量的内存, 同时java.util.concurrent.locks也占用了大量的内存. 原因估计为struts2里面的参数转化拦截器出了问题(没有得到求证).
而在spring3的mvc下(restful), 会存在一个问题就是, 如果我要直接转向我的 http://localhost/myapp/model1/my.jsp 时如果我不在mvc配制文件下配制下配制, 那它怎么进行转向, 这也是一个问题. 也就是说我增加一个jsp, 还要改配制文件, 这很烦啊. 或者说是我没有发现有别的方法可做, 请大家指教.
总共来说: 在高并发的情况下, strut2慎用, spring3可以大胆使用. spring3在性能和内存使用上都不会存在问题(这点我们是经过压力测试的). spring3 mvc可以达到每秒3000的并发点击. (当然经过的controller是很简单的, 没有业务逻辑在里面), 且内存可以正常回收.
而在spring3的mvc下(restful), 会存在一个问题就是, 如果我要直接转向我的 http://localhost/myapp/model1/my.jsp 时如果我不在mvc配制文件下配制下配制, 那它怎么进行转向, 这也是一个问题. 也就是说我增加一个jsp, 还要改配制文件, 这很烦啊. 或者说是我没有发现有别的方法可做, 请大家指教.
总共来说: 在高并发的情况下, strut2慎用, spring3可以大胆使用. spring3在性能和内存使用上都不会存在问题(这点我们是经过压力测试的). spring3 mvc可以达到每秒3000的并发点击. (当然经过的controller是很简单的, 没有业务逻辑在里面), 且内存可以正常回收.
是不是真的哟,不要吓我撒!
默认拦截器应该精简一下,把不用的拦截器去掉即可。
71 楼
小刘而已
2010-05-08
wen66 写道
spring3与struts2有很大的区别, 最近我们在struts2.1及spring3.0.2上做过压力测试, 发现struts2.1在默认的配制下存在严重的性能问题. 每秒的点击数不会超过200, 而如果用struts2的dispatchServlet去拦截带有参数的jsp如(http://localhost/myapp/my.jsp?para1=1¶2=2) 这样的url时, 在大并发时, 存在很严重的内存泄漏的问题. 用jprofile可以发现java.util.concurrent.concurrenthashmap占用了大量的内存, 同时java.util.concurrent.locks也占用了大量的内存. 原因估计为struts2里面的参数转化拦截器出了问题(没有得到求证).
而在spring3的mvc下(restful), 会存在一个问题就是, 如果我要直接转向我的 http://localhost/myapp/model1/my.jsp 时如果我不在mvc配制文件下配制下配制, 那它怎么进行转向, 这也是一个问题. 也就是说我增加一个jsp, 还要改配制文件, 这很烦啊. 或者说是我没有发现有别的方法可做, 请大家指教.
总共来说: 在高并发的情况下, strut2慎用, spring3可以大胆使用. spring3在性能和内存使用上都不会存在问题(这点我们是经过压力测试的). spring3 mvc可以达到每秒3000的并发点击. (当然经过的controller是很简单的, 没有业务逻辑在里面), 且内存可以正常回收.
而在spring3的mvc下(restful), 会存在一个问题就是, 如果我要直接转向我的 http://localhost/myapp/model1/my.jsp 时如果我不在mvc配制文件下配制下配制, 那它怎么进行转向, 这也是一个问题. 也就是说我增加一个jsp, 还要改配制文件, 这很烦啊. 或者说是我没有发现有别的方法可做, 请大家指教.
总共来说: 在高并发的情况下, strut2慎用, spring3可以大胆使用. spring3在性能和内存使用上都不会存在问题(这点我们是经过压力测试的). spring3 mvc可以达到每秒3000的并发点击. (当然经过的controller是很简单的, 没有业务逻辑在里面), 且内存可以正常回收.
是不是真的哟,不要吓我撒!
70 楼
thinkingzhu
2010-04-29
现在JavaScript框架这么流行,JSF的地位就更加尴尬了。
SpringMVC的零配置用起来很爽,但到了后期就发现,用配置文件其实还是有用的。。。至少管理起来比较集中
还有,牛的框架不一定能流行的。。Struts1跟webwork就是一个例子
SpringMVC的零配置用起来很爽,但到了后期就发现,用配置文件其实还是有用的。。。至少管理起来比较集中
还有,牛的框架不一定能流行的。。Struts1跟webwork就是一个例子
69 楼
fxsc
2010-04-28
tapestry,ASP.net,JSF这些货色,自以为用事件驱动模式就能够把桌面开发的那套搬到互联网上,根本是无视互联网和http协议的特点,缘木求鱼。说JSF好的有几个用他们开发过项目,特别是需求频繁变动的那种。
68 楼
jy1245626
2010-04-20
wen66 写道
而在spring3的mvc下(restful), 会存在一个问题就是, 如果我要直接转向我的 http://localhost/myapp/model1/my.jsp 时如果我不在mvc配制文件下配制下配制, 那它怎么进行转向, 这也是一个问题. 也就是说我增加一个jsp, 还要改配制文件, 这很烦啊. 或者说是我没有发现有别的方法可做, 请大家指教.
public String redirectMyJsp(){ return "redirect:"+"model1/my.jsp"; }
也可以redirect一个请求。
67 楼
murainwood
2010-04-20
slaser 写道
zdmcjm 写道
我只是说seam,能发挥java的威力,而不是说什么什么不好。
并且我曾用grails做过几个项目,其底层也是springmvc spring 之类的,饱受无状态与自己管理状态之苦。特别是用户,需要切换身份,切换权限,切换工作区之类。。
并且我曾用grails做过几个项目,其底层也是springmvc spring 之类的,饱受无状态与自己管理状态之苦。特别是用户,需要切换身份,切换权限,切换工作区之类。。
这个确实是,而且seam在某些应用里面有很大的优势,比如一些传统的管理系统项目,我最不爽的的是JSF,做B/S出生的人估计没几个喜欢那套呆板难用的jsf组件。
深恶痛绝
发表评论
-
利用last modified头节省服务器资源和网络带宽
2011-09-19 17:27 1479last-modified 和 if-modified-sin ... -
系统架构中数据库的设计
2010-11-08 16:27 1821架构师往往是有前瞻性的 这个前瞻性是在很多项目经验的基础上总结 ... -
用telnet操作memcached
2010-07-16 14:14 1872telnet localhost 11211 流量统计 st ... -
spring的@Transactional为什么不能指定TransactionManager?
2010-06-10 16:44 7138用过spring的人应该都使用过@Transactional注 ... -
(转)Memcached的stats命令
2010-04-18 11:57 1849命令行查看Memcached运行状态 很多时候需要监控服务器 ... -
tomcat io 与 nio性能比较
2010-04-10 21:30 10787tomcat连接器(conncector)可以配置成NIO方式 ... -
nginx+tomcat配置
2010-04-07 15:16 4151一直听说nginx很厉害 今天装了一个 没有做任何配置直接ab ... -
浏览器缓存总结
2010-03-27 10:20 3086浏览器缓存主要有两类 ... -
理解linux下sendfile()系统调用
2010-03-21 11:29 3078服务器响应一个http静态资源请求的步骤如下: 1 把磁盘文件 ... -
freemarker生成静态jsp碎片乱码
2010-03-19 14:56 3146用freemarker定时生成jsp文件 然后通过jsp:i ... -
用apache ab做压力测试
2010-03-14 16:04 1881测试静态html资源 文件大小44byte,总请求数10000 ... -
apache ab命令详解(转)
2010-03-14 11:58 2637原文地址:http://blog.csdn.net/zhong ... -
压力测试关心的几个指标
2010-03-13 20:58 4752并发用户数 这个不是多说了,可简单理解为并发线程数 总请求次数 ... -
利用squid refresh_pattern缓存图片
2010-03-03 15:22 2964用浏览器请求一张图片1.gif的过程如下 1 发送http到s ... -
如何理解Squid refresh_pattern
2010-03-03 14:25 1649refresh_pattern的作用: 用于确定一个页面进入c ... -
关于Cache-Contro缓存
2010-03-03 10:01 1884浏览器缓存一直是web开发人员比较重视的优化点 这要有这个几个 ...
相关推荐
spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 ...
spring-webmvc-struts.jar对Struts和Spring整合时需要用到的包
**Struts2与Spring MVC比较:** 1. **灵活性**:Spring MVC允许更多的自定义,如自定义拦截器、视图解析器,而Struts2的扩展性相对弱些。 2. **依赖注入**:Spring MVC是Spring框架的一部分,天然支持DI,而Struts2...
下面我们将详细探讨Spring MVC的核心组件、工作流程以及与Struts2.x的比较。 1. **Spring MVC 核心组件** - **DispatcherServlet**:Spring MVC 的核心是DispatcherServlet,它作为一个前端控制器,负责接收请求...
2. Struts与Spring的整合,包括Action的配置、Service注入到Action、以及结果的处理。 3. 使用AspectJ的注解来定义切面,如`@Aspect`、`@Pointcut`、`@Before`、`@After`等。 4. 切面的织入策略,包括编译时织入和...
3. **Interceptor**:类似于Spring MVC的HandlerInterceptor,Struts2的拦截器用于在Action执行前后执行特定任务。 4. **Result**:处理Action执行后的结果,决定如何展示给用户。 5. **ValueStack**:Struts2的...
"spring-webmvc-struts"可能指的是Spring与Struts的集成包,Struts是另一个流行的Java Web MVC框架。这个库可能包含了一些桥接代码,帮助开发者将Spring的IoC(Inversion of Control,控制反转)和AOP功能与Struts的...
spring-webmvc-struts-2.5.6-sources
《构建摄影平台:Spring+Spring MVC+Struts+Hibernate整合详解》 在现代Web开发领域,Spring框架以其灵活性和强大的企业级应用支持而备受青睐。本项目“Spring+Spring MVC+Struts+Hibernate开发摄影平台完整版系统...
综上所述,"DWR与SPRING,DWR与STRUTS2的整合"主题涵盖了现代Java Web开发中重要的三个方面:DWR的实时通信能力、Spring的全面后端支持和Struts2的MVC架构。通过整合这三者,开发者可以构建出具有高效交互、灵活管理...
在IT行业中,MVC(Model-...理解并熟练运用MVC模式、Struts2框架、Spring框架以及Hibernate ORM,对于提升Java Web开发能力大有裨益。通过解答相关选择题,可以检验和巩固这些知识点的理解程度,进一步提升个人技能。
`struts2-spring-plugin-2.5.16.jar`是Struts2与Spring集成的插件,它使得Struts2可以利用Spring的依赖注入(DI)和面向切面编程(AOP)能力。通过这个插件,我们可以将Action类的实例化和管理交给Spring容器,从而...
Spring3、Struts2和Ibatis的整合,构建了一个完整的MVC+持久层架构。Spring作为整个应用的调度中心,管理所有对象的生命周期,包括Struts2的Action和Ibatis的SqlSession。Struts2负责接收HTTP请求,调用Action执行...
本项目“MVC注解Spring-Struts2Spring2hibernate3”结合了Spring、Struts2和Hibernate3这三大框架,以注解的方式实现了一个完整的MVC解决方案。下面将详细介绍这三个框架以及它们之间的协作。 首先,Spring框架是...
Spring MVC作为其Web层的一部分,与Struts相比,更加轻量级和灵活。Spring MVC通过DispatcherServlet作为入口点,处理HTTP请求,并通过配置或注解定义控制器(@Controller)。模型数据通常通过模型对象(Model或...