由于项目里有一个servlet里用到了好多类变量,而servlet是单例的,这样的话多个用户同时点击调用这个servlet的时候就共享类变量了,最终导致结果错误。
我已经通过方法传参数的方式解决了一个其中一个变量的问题。但是几十个变量都这样传改动量大了。
请问下是否可以将这个servlet配置成非单例的,即不同的请求过来使用的servlet对象都是不一样的。

解决方案 »

  1.   

    Servlet设置成非单例的应该是不行的
    但是可以变相改变把所有的对象值放入集合,集合放入ThreadLocal对象
    这样所有线程之间的数据就不会冲突了
      

  2.   

    3楼说的对象值是指servlet的对象值吗?这个对象貌似是容器创建的,我管不了的
      

  3.   

    ThreadLocal每次只能保存一个变量,所以我叫你用集合
      

  4.   

    那要几十个类变量放进去,然后再取出来,还是麻烦啊.最好能把servlet配置成多个对象的。
    加上同步也能解决问题,而且改动量最小,但是效率低了,不推荐的
      

  5.   

    每次创建servlet对象的代价太大。
    可以放在javax.servlet.http.HttpSession的attribute里面。
      

  6.   

    michaellufhl 的方法还是有点技术含量的,虽然我不想这样做.
    struts的action默认就是非单例的,用的人很多啊,也没看到很多人在叫效率低嘛。8楼是不是夸张了点
      

  7.   


    创建Action和创建Servlet这能比吗??级别不一样
      

  8.   

    那么多类变量不是我定义的,是公司里的前辈们写的代码,我现在是在改他们的bug
      

  9.   

    你直接存放Session吧。ThreadLocal和他的效果是一样的。还有同步和刚才的两个方法效果是不一样的。不是效率的问题,是逻辑上的问题
      

  10.   

    action也是继承了servlet,可以认为是一样的
      

  11.   


    哎。Action继承了Servlet?????Struts的流程是先通过ActionServlet
    再由ActionServlet转交RequestProcessor
    RequestProcessor根据配置,实例化Action
    所以Action接口是顶层类。
      

  12.   

    俺说错了,不好意思。我是想说的这个类org.apache.struts.action.ActionServlet
      

  13.   

    重新创建个类处理你那变量,在servlet里面调用不就o了
      

  14.   

    如果你在同一个程序中就不用频繁调用那个servlet 你可以一次赋值多次使用呀。
      

  15.   

    严禁在 Servlet 中使用成员变量!