先不提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是每走一次线程,都是独立的线程,除非他上个线程已经处理完,否则下个线程是不会处理,所以不存在这个问题,各位有何意见?指教。。
[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]
当然你可以这样测试一下! 我表达能力比较差! 呵呵 能帮到你!