Struts2整合Spring创建的Action同步问题

前提:bug

1.关于个人中心头像隔断时间自动被更改;2014/12/18

2.穿戴设备手环用户实时上传数据间隔报异常;(原则上是每天用户在XXX表只有一条记录,但是查看数据库发现有些日期竟然出现多条记录)2014/1/12


原因:

struts2的对象被拖管给spring管理(spring的bean在Ioc容器范围内默认都是singlen的),而且如果项目中也不是采取了struts2-convention-plugin.jar 这个零配置的struts2的插件进行开发,所以产生了线程安全问题;


解决方案:

在Struts2的Action上添加@Scope(BeanDefinition.SCOPE_PROTOTYPE)


但这只是控制了Action上的同步,当Action调用Service(也是由spring注入,默认单例)方法时也是会产生同步问题,由此产生2的问题,在实现的方法添加同步synchronized,随之上传速度也下降了,待优化...



详细原因:

1.struts2为每个线程提供一个action实例,多线程访问时不会出现问题。当使用spring管理struts2的action实例对象时,scope必须配置为prototype或者session,若配置为 singleton则多线程访问时会出现问题,多用户访问时有的用户访问到的是另一个用户的数据,数据会发生乱窜现象。

2.scope=“prototype”是为每个请求提供一个action实例。
   scope=“session”是为每个会话提供一个action实例。

3.通常使用prototype,即让spring容器为每个请求提供一个action实例,好处是服务器端不用维护用户状态信息,否则使用session服务器端必须存储状态信息,用户多时占用服务器端内存过多。使用prototype时,必须自己在客户端维护用户的状态,每次访问服务端时将相应状态信息提交给服务器。
例如scope=“prototype”时,页面一般< input name="id" type="hidden" value="${id}"/>用来存储用户的id信息,访问action时提交到server端供action中函数使用。而使用scope=“session”时,页面不必使用hidden的对象隐藏id信息,只要服务端获取过用户的id,action中的 id属性即会保存这个信息。



参考资料:
1.http://it.chinawin.net/softwaredev/article-fc78.html
2.http://www.it-nan.com/struts2spring-action-scope


猜你喜欢

转载自blog.csdn.net/pmt1982/article/details/79635001