SpringMVC框架并发时出现id变成另外一个用户id问题

Posted Jacck

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC框架并发时出现id变成另外一个用户id问题相关的知识,希望对你有一定的参考价值。

今天测试写的代码,出现了在用一个账户登录操作的时候,操作记录的是另外一个id。

经过查找网上的解决方案确认了问题:在controller里面定义了一个userid属性,每次都通过userid传输值。然后多线程情况下会同时共享这个userid属性

解决方案:把controller里面的属性删除,然后用其他方案替代

 

找到了一篇关于controller单例和多例分析比较好的文章:如下

 

对于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的属性定义多了,都不知道哪个方法用了这个属性,对以后程序的维护还是很麻烦的。
 
引自:http://blog.csdn.net/qq_27026603/article/details/67953879
作者:刘超军的博客




以上是关于SpringMVC框架并发时出现id变成另外一个用户id问题的主要内容,如果未能解决你的问题,请参考以下文章

golang的beego框架开发时出现的问题纪录

java高并发框架 SSM框架 详细整合教程(Spring+SpringMVC+MyBatis)

java 高并发高性能分布式 java后台框架 springmvc整合mybatis框架源码

当运行测试用例时出现错误“找不到机器人框架安装”以及如何解决这个问题?

java大数据 高并发 系统框架 springmvc mybatis Bootstrap html5 shiro maven SSM SSH

使用 swagger-springmvc(现为 springfox)查看 swagger api-docs 时出现“404 Not Found”