zoukankan      html  css  js  c++  java
  • 实际工作中遇到关于Struts2线程安全的问题解决

        今天工作遇到一个难缠的bug,浪费了2个小时终于解决。

               问题描述:对资源的管理中用到关键字查询以及分页查询。视图控制器用到struts2,数据存储用spring的data-mongodb来存储数据以及查询数据。但是发现一个问题,在用分页查询时能查询出所有记录,然后用关键字查询获取查询内容后,在用分页查询但是只能获取关键查询的数据,其他数据死活查询不出来。开始我以为是自己前端有逻辑问题,但是我用其他的浏览器操作同样出问题。因此知道问题出在后台代码。开始以为是不是数据有缓存,但是其他模块也这样实现没问题,纠结了半天,最后我对比了其他模块在struts.xml配置中差异,发现其他模块的action中spring配置有scope=''propotype",但是又想如果是线程安全问题,也不应该是因为action,给数据有关应该是service层或是dao层,但是还是这样尝试修改一下,奇迹出现了,问题解决了。开始我以为struts2是线程安全的他通过过滤每次请求都会实例化,交给spring管理应该默认都是propotype.所以我思考问题所在。最后终于明白了。

         bug原因:由于sttruts2交个spring管理默认是单件模式,所以就创建一次对象,这样就有线程安全问题,其他请求访问时,由于关键查询,key一直存在值,所以在回到分页查询其实执行的还是关键字查询,这就造成了以上问题,是个典型的线程安全问题。

      技术总结:

    Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。
    Spring的Ioc容器管理的bean默认是单实例的,上一次请求处理的状态信息被保持下来,并影响了下一次的请求,实际上就是Action中的类变量被不同的请求读取,出现错误结果

    解决:就是不用单例, spring中bean的作用域设为prototype,每个请求对应一个实例.

  • 相关阅读:
    CDialogConfigStringRecord+CDialogConfigManage 如何保存listbox中未显示的信息
    vs2010 打开 vs2005 工程报错
    优秀程序员的两大要素:懒 + 笨
    架构设计中的方法学(四)
    程序员应该具备的素质汇总(逐步总结)(转)
    架构设计中的方法学(三)
    成都中青旅欢迎你
    游洪崖洞有感
    架构设计中的方法学(七)
    架构设计中的方法学(二)
  • 原文地址:https://www.cnblogs.com/maybo/p/5196640.html
Copyright © 2011-2022 走看看