记一次项目上线遇见的问题(由于单例引起的系统运行速度奇慢无比)

  在一次完工之后准备项目上线,晚上上线完之后甲方员工反映系统异常慢,已经到了影响工作的地步,在和同事测试(七八个人同事点击一个功能界面)发现真的慢,最后只能双休日加班继续弄,请来了有几年工作经验的老鸟过来协助解决。


项目是使用ssm框架搭建的。

周六,老鸟到来进行监测,当多个同事同事点击之后发现大量的时间花费在Resource的注入,服务器cpu飙升100%,也就是问题出在调用controller和service层的时候大量的依赖注入,使得时间花费很多。一个人调用的时候会创建一次,第二个人调用的时候也会创建一个新的对象再次进行注入使得多人同时用回发生cpu飙升,速度变慢的现象。再加上有多个service实现方法代码行数相当多(10000多行),@Resource相当多(40多个)。那么问题很明显了单例问题。

项目在service层注解使用的是@Scope("prototype")使用的多例,spring中如果不加这个默认是单例模式,因为使用的多例在每个用户调用这个方法的时候都会创建一个新的对象进行bean的注入。当多个用户同事调用方法时会进行大量的注入,使得系统奇慢无比。当注释掉注解之后问题解决,同时在检查各个方法中有没有使用静态方法静态常量的如果有保持多例没有就改为单例。

单例多例

原文:https://blog.csdn.net/qq_27026603/article/details/67953879

原文2:https://blog.csdn.net/znoone/article/details/79202802

对于SpringMVC Controller单例和多例,下面举了个例子说明下.
第一次:类是多例,一个普通属性和一个静态属性。


结果:普通属性:0.............静态属性:0
普通属性:0.............静态属性:1
普通属性:0.............静态属性:2
普通属性:0.............静态属性:3
所以说:对于多例情况普通属性时不会共用的,不会产生影响,对于静态属性会去共用这个属性。

第二次:类改为单例

结果:普通属性:0.............静态属性:0
普通属性:1.............静态属性:1
普通属性:2.............静态属性:2
普通属性:3.............静态属性:3
所以说:对于单例情况普通属性和静态属性都会被共用。

第三次:类去掉@Scope注解

结果:普通属性:0.............静态属性:0
普通属性:1.............静态属性:1
普通属性:2.............静态属性:2
普通属性:3.............静态属性:3
所以说:springmvc默认是单例的。

另外在其他方法里面打印

输出的结果是

跳到别的方法里面也并不会去取初始值,而是再去共用这个属性。

最终:尽量不要在controller里面去定义属性,如果在特殊情况需要定义属性的时候,那么就在类上面加上注解@Scope("prototype")改为多例的模式,以前struts是基于类的属性进行发的,定义属性可以整个类通用,所以默认是多例,不然多线程访问肯定是共用类里面的属性值的,肯定是不安全的,但是springmvc是基于方法的开发,都是用形参接收值,一个方法结束参数就销毁了,多线程访问都会有一块内存空间产生,里面的参数也是不会共用的,所有springmvc默认使用了单例,所以controller里面不适合在类里面定义属性,只要controller中不定义属性,那么单例完全是安全的。springmvc这样设计主要的原因也是为了提高程序的性能和以后程序的维护只针对业务的维护就行,要是struts的属性定义多了,都不知道哪个方法用了这个属性,对以后程序的维护还是很麻烦的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值