讨论下struts1的并发问题!

先不提struts1过时不过时的问题,就讨论下并发问题。

如下代码:
[code="java"]
private PhraseForm myfrm;

private void initFrm(ActionForm form){
    this.myfrm=(PhraseForm)form;
}

private PhraseDao getDAOInstance() throws Exception{
    PhraseDao dao=null;
    try {
        dao=new PhraseDao();
    } catch (Exception e) {
        this.log.error("getDAOInstance()", e);
        throw new Exception();
    }

    return dao;
}


      public ActionForward insertObj(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
    throws Exception{
    try{
        initFrm(form);
        getDAOInstance().getInsertData(form);
    }catch (Exception ex) {
      this.log.error(ex.getMessage(), ex);
    }finally{

    }

    return mapping.findForward("PostInfo");
  }

       public ActionForward editObj(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
    throws Exception{
    try{
        initFrm(form);
        getDAOInstance().getUpdateInfoData(form);
    }catch (Exception ex) {
      this.log.error(ex.getMessage(), ex);
    }finally{

    }

    return mapping.findForward("PostInfo");
  }

[/code]

注意看 [color=red]initFrm(form); [/color]这个,有人说这样声明成共用的,如果数据量大的时候会导致并发问题,如多个用户同时访问这个action时候,导致数据相互修改!

我个人观点是:struts1是每走一次线程,都是独立的线程,除非他上个线程已经处理完,否则下个线程是不会处理,所以不存在这个问题,各位有何意见?指教。。

4个回答

[quote]但是可以用tomcat 的debug状态测试下,我断点在格式化的form这里,发现他必须先执行完一个dao处理,才会处理第二个dao。这个又怎么解释呢??很疑问?[/quote]

debug 本来就没办法很直接 的 模拟 多线程 访问的问题
一次访问没完! 就没办法 下一次访问! 不是吗!

你只要坚信
Struts框架只会为每个Action类创建一个Action实例
那么 就有可能 造成 共享的变量 这个值每次被 后面的冲掉了!
如何LZ 需要 可以在整个多线程的 访问 测试下!

首先你必须承认:
[color=red]Struts框架只会为每个Action类创建一个Action实例(与servlet是一样的)。所有的客户请求共享一个Action实例,并且所有请求线程可以同时执行它的execute()方法。 [/color]
所以,每个action只有一个实例, 在action打印this也可以看到, 确实是一样的,

[quote]struts1是每走一次线程,都是独立的线程,除非他上个线程已经处理完,否则下个线程是不会处理,[/quote]
[color=red]单实例 多线程 共享资源的! 个人理解![/color]
所以,
不要在Action里面使用全局变量记忆数据, 没有意义而且不安全

[quote]private PhraseForm myfrm;

private void initFrm(ActionForm form){   
    this.myfrm=(PhraseForm)form;   
}  [/quote]

你这么写! 每次方法都会改变 myfrm的值!是吧!
来一个 action myfrm 是 myfrm1
第二个 action myfrm 是 myfrm2

这样他就共享了!

但是需要说明:
1.0 正常情况下 action的form 是不会共享的!
2.0 initFrm([color=red]form[/color]);

getDAOInstance().getUpdateInfoData([color=red]form[/color]);

你这么写 没使用 myfrm 啊! 我感觉 myfrm 多余了!
个人理解 不足之处 一起讨论哈!

[quote]try {

initFrm(form);

strSQL=" delete RepeaterInfo where 1=1 and repeaterid= " +

"'"+myfrm.getSubsys_id()+"'" ;

db.setDBStmt(strSQL);

db.doDelete(); [/quote]

DAO 里面这么写!我个人认为是肯定会 共享的! 会造成错误的!
原因:
第一个 action_1 myfrm 是 myfrm1 里面的 myfrm.getSubsys_id() 是 1
假如 度很快 又来一个action_2
myfrm.getSubsys_id() 是 2
那么在这个时候你 在 action_1 里面使用myfrm.getSubsys_id() 的时候!
得到的值肯定是 2了! [color=red]这样会造成 这个值每次被 后面的冲掉了![/color]

当然你可以这样测试一下! 我表达能力比较差! 呵呵 能帮到你!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐