zoukankan      html  css  js  c++  java
  • Struts2 单例与多例

    struts 2的Action默认是多实例的并非单例,也就是每次请求产生一个Action的对象,即每次访问的参数都被封装在Action的成员变量中。

    struts2中Action多实例的优势在于是线程安全的,每次请求都会创建单独的Action类来处理,而不用想servlet一样担心线程安全问题。

    案例背景: 
    项目采用spring+Struts2装配方式。Spring管理Struts2的Action自动设置为单例。这样Action的生命周期为服务器生命周期,也就是说不关闭应用服务器,Action一直存在,Action中的属性也一直存在。

    这种装配方式的好处:

    分页对象所需要的数据对象存在于Action中是不被销毁的,直到页面重新对数据对象输入查询条件.

    这样做的缺点在于:

    会造成线程安全问题: 多个线程会共享一个ActionContext和ValueStack,这样并发访问的时候就会出现问题了.例如造成别人填写的数据被你看到了.又例如,两个线程同时提交向同一个Action提前请求参数或在同一个页面上查询信息,会在提交和查询的先后顺序等条件上产生冲突,导致出来一些意外的问题。

    因此思考是否可以通过一些办法来解决此类问题:

    办法一:设置Action bean的生命周期为Session,即每个浏览器的打开影响着一套Action的生命周期,解决不同用户互相影响的问题;

    (通常和spring整合使用的时候,在struts.xml文件要配置一个元素 )

    <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
    <constant name="struts.objectFactory" value="spring" />
    • 1
    • 2
    • 1
    • 2

    然后在spring的配置文件中的bean元素里用一个scope属性来配置action是用什么生命周期,singleton,prototype,request,session等等)

    Struts2的Action的线程安全问题

    Struts2的Action的线程安全问题

    背景 :

    • 1) Struts2 默认会对每一个请求,产生一个新的Action的实例来处理.

    • 2) Spring的Ioc容器管理的bean默认是单实例的.

    当Struts2与Spring整合后,由Spring来管理Struts2的Action,会遇到什么问题 ?如何解决 ?


    会遇到什么问题?

    Struts2与Spring整合后, 由spring来管理Struts2的Action, bean默认是单实例有情况下,会有如下问题:

    • 1) Struts2的Action是单例,其中的FieldError,actionerror中的错误信息会累加, 即使再次输入了正确的信息,也过不了验证.

    • 2) Struts2的Action是有状态的,他有自己的成员属性, 所以在多线程下,会有线程安全问题,这是最大的问题。

    如何解决?

    • 方案一: 就是不用单例, spring中bean的作用域设为prototype,每个请求对应一个Action实例.(建议这样做)

    • 方案二: spring中bean的作用域设为session ,每个session对应一个实例,解决了多线程问题.

    总结 :

    方案一:bean的作用域设为prototype, 不用担心性能不好, 实际测试过,多实例Action性能没问题.

    方案二: 有人担心方案一性能不好, 所有才有了方案二, 不知比方案一性能 能高多少?应该不会高多少。

    参考: http://m.blog.csdn.net/article/details?id=8120365

  • 相关阅读:
    EntityFramework优缺点
    领导者与管理者的区别
    七个对我最好的职业建议(精简版)
    The best career advice I’ve received
    Difference between Stored Procedure and Function in SQL Server
    2015年上半年一次通过 信息系统项目管理师
    Difference between WCF and Web API and WCF REST and Web Service
    What’s the difference between data mining and data warehousing?
    What is the difference between a Clustered and Non Clustered Index?
    用new创建函数的过程发生了什么
  • 原文地址:https://www.cnblogs.com/AnswerTheQuestion/p/6700976.html
Copyright © 2011-2022 走看看