问题描述
系统刚上线,在测试环境一切正常,投入到生产环境后前2天都正常,现在莫名其妙的的报这个错...由于管理原因,不允许重启服务器和服务,只能重启应用应用重启后仍然报错如果直接替换class文件,可以暂时顺利执行,一会儿后仍然报这个错误现在的情况是大多数情况下报这个错,偶尔能成功一,二次Vectorv=newVector();v.clear();v.add(washbrnono);v.add(UserNo);v.add(CardNo);DaoHelper_helper=newDaoHelper(this,"zzfw");try{_helper.getConnection();CallableStatementcall=_helper.callProc("ZJEBANK_ZZFW_CARWASH.Execute",v,2);Stringretcode=call.getString(4);Stringretmsg=call.getString(5);System.out.println("retcode:"+retcode);System.out.println("retmsg:"+retmsg);
后台看了下跟着,应该是CallableStatementcall=_helper.callProc("ZJEBANK_ZZFW_CARWASH.Execute",v,2)
这行没有执行DaoHelper:publicDaoHelper(BaseModelmodel,Stringdsname)throwsSystemException{baseModel=model;if(baseModel!=null&&baseModel.getModelName()!=null){baseModel.addDaoHelper(this);}else{thrownewSystemException(model.getModelName(),"ERR-00052");}dataSourcename=dsname;dataSource=Constance.getInstance().getDataSource(dataSourcename);if(dataSource==null){thrownewSystemException(model.getModelName(),"ERR-00051",dataSourcename);}}publicCallableStatementcallProc(Stringprocname,VectorinP,intoutP)throwsSQLException{returncallProc(procname,inP,outP,0);}publicCallableStatementcallProc(Stringprocname,VectorinP,intoutP,intoutC)throwsSQLException{initail();StringBufferbuf=newStringBuffer();buf.append("{call").append(procname);buf.append("(");inttotal=inP.size()+outP+outC;for(inti=0;i<total-1;i++){//System.out.println("i:"+i);buf.append("?,");}buf.append("?)}");CallableStatement_call=conn.prepareCall(buf.toString());inti;for(i=1;i<=inP.size();i++){_call.setString(i,(String)inP.elementAt(i-1));}for(intj=0;j<outP;j++){_call.registerOutParameter(i,OracleTypes.VARCHAR);i++;}for(intj=0;j<outC;j++){_call.registerOutParameter(i,OracleTypes.CURSOR);i++;}_call.execute();return_call;}
解决方案
解决方案二:
现在不能确定到底是java引起还是数据库问题导致存储过程没有调用怀疑存储过程也有缺陷请教数据库高手在一个游标打开期间CURSORc_washcarvoucherOPENc_washcarvoucher;...CLOSEc_washcarvoucher;里面有一定的逻辑判断碰到异常直接抛出,这样是否会导致游标没有正常关闭而java链接数据库1个链接可能只有固定的游标数...不然真的解释不了一会儿成功,一会儿失败
解决方案三:
数组下标越界了
解决方案四:
引用2楼qq_992784113的回复:
数组下标越界了
这个我也知道,应该是没取道Stringretcode=call.getString(4);Stringretmsg=call.getString(5);可为什么存储过程没调用呢
解决方案五:
看了下,问题应该是出在存储过程上面了,返回值没有那么多,所以你取值的时候,Stringretcode=call.getString(4);Stringretmsg=call.getString(5);越界你可以单独测试下你的存储过程啊,如果是偶尔发生,那么越可以说明你的存储过程有问题,你可以通过生产环境的数据进行测试,这样就比较容易发现问题了