问题描述
先不提struts1过时不过时的问题,就讨论下并发问题。如下代码: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"); } 注意看 initFrm(form); 这个,有人说这样声明成共用的,如果数据量大的时候会导致并发问题,如多个用户同时访问这个action时候,导致数据相互修改!我个人观点是:struts1是每走一次线程,都是独立的线程,除非他上个线程已经处理完,否则下个线程是不会处理,所以不存在这个问题,各位有何意见?指教。。 问题补充:7454103 写道
解决方案
引用但是可以用tomcat 的debug状态测试下,我断点在格式化的form这里,发现他必须先执行完一个dao处理,才会处理第二个dao。这个又怎么解释呢??很疑问?debug 本来就没办法很直接 的 模拟 多线程 访问的问题一次访问没完! 就没办法 下一次访问! 不是吗!你只要坚信 Struts框架只会为每个Action类创建一个Action实例 那么 就有可能 造成 共享的变量 这个值每次被 后面的冲掉了!如何LZ 需要 可以在整个多线程的 访问 测试下!
解决方案二:
引用try { initFrm(form); strSQL=" delete RepeaterInfo where 1=1 and repeaterid= " + "'"+myfrm.getSubsys_id()+"'" ; db.setDBStmt(strSQL); db.doDelete(); DAO 里面这么写!我个人认为是肯定会 共享的! 会造成错误的!原因: 第一个 action_1 myfrm 是 myfrm1 里面的 myfrm.getSubsys_id() 是 1 假如 度很快 又来一个action_2 myfrm.getSubsys_id() 是 2 那么在这个时候你 在 action_1 里面使用myfrm.getSubsys_id() 的时候! 得到的值肯定是 2了! 这样会造成 这个值每次被 后面的冲掉了! 当然你可以这样测试一下! 我表达能力比较差! 呵呵 能帮到你!
解决方案三:
引用private PhraseForm myfrm; private void initFrm(ActionForm form){ this.myfrm=(PhraseForm)form; } 你这么写! 每次方法都会改变 myfrm的值!是吧! 来一个 action myfrm 是 myfrm1 第二个 action myfrm 是 myfrm2这样他就共享了! 但是需要说明: 1.0 正常情况下 action的form 是不会共享的! 2.0 initFrm(form); getDAOInstance().getUpdateInfoData(form); 你这么写 没使用 myfrm 啊! 我感觉 myfrm 多余了! 个人理解 不足之处 一起讨论哈!
解决方案四:
首先你必须承认:Struts框架只会为每个Action类创建一个Action实例(与servlet是一样的)。所有的客户请求共享一个Action实例,并且所有请求线程可以同时执行它的execute()方法。 所以,每个action只有一个实例, 在action打印this也可以看到, 确实是一样的, 引用struts1是每走一次线程,都是独立的线程,除非他上个线程已经处理完,否则下个线程是不会处理, 单实例 多线程 共享资源的! 个人理解!所以, 不要在Action里面使用全局变量记忆数据, 没有意义而且不安全