在Oracle(9.0.1)先将要处理的数据(1000条以上)插入临时表,然后再调用一存储过程对这批数据进行集中处理,并返回处理信息,此存储过程在PL/SQL环境相同数据量下测试执行时间为10秒左右,但是通过CallableStatement去执行需要130秒左右(即调用executeQuery()后消耗的时间),经过测试,存储过程执行完成的时间也在10秒左右,但是在执行完返回的过程中消耗上百秒,如果去除返回值,也还需要50秒左右,百思不得其解,不知是否与驱动程序有关?(驱动为oracle的classes12.zip)

解决方案 »

  1.   

    程序如下,请大家瞅瞅:
    public Object execute() throws SQLException {
    List results = null;
    String plsql = getPLSQL(plsqlName, params);
    LogHelper.logger.info("executeStatement: " + plsql);
    Connection cn = null;
    CallableStatement cs = null;
    try {
    cn = getConnection();
    cs = cn.prepareCall(plsql);
    setParamToStatement(cs, params,true);
     
    cs.execute();//1000条数据,就这个调用需要130S,在PL/SQL下测试相同数据量,只要10S
        
    results = parseStatement(cs, params);
    } finally {
    closeCallable(cs, cn);
    }
    return results;
      

  2.   

    完整的程序:
    public List executeCallable(final String plsqlName, final Object[] params) {
        return (List) new DataAccssesExecuteTemplet().run(new ITemplet() {
    public Object execute() throws SQLException {
        List results = null;
        String plsql = getPLSQL(plsqlName, params);
        LogHelper.logger.info("executeStatement: " + plsql);
        Connection cn = null;
        CallableStatement cs = null;
        try {
    cn = getConnection();
    cs = cn.prepareCall(plsql);
    setParamToStatement(cs, params,true); cs.execute();//1000条数据,就这个调用需要130S,在PL/SQL下测试相同数据量,只要10S     
    results = parseStatement(cs, params);
        } finally {
    closeCallable(cs, cn);
        }
     return results;

        }    private String getPLSQL(String plsqlName, Object[] params) {
    StringBuffer parameters = new StringBuffer();
    boolean hashReturnValue = true;
    if((params[0]+"").startsWith("OracleTypes")){
        parameters.append("{ ? = call " + plsqlName + "("); }else{
        parameters.append("{ call " + plsqlName + "(");
        hashReturnValue = false;
    }
    for (int i = 0; i < params.length; i++) {
        parameters.append("?,");
    }
    if(parameters.length()>3 && hashReturnValue)
        parameters.delete(parameters.length()-3,parameters.length());
    else
        parameters.delete(parameters.length()-1,parameters.length());
    parameters.append(") }");
    return parameters.toString();
        }    // 执行SQL语句并返回一个List封装的多个返回参数集
        private List parseStatement(CallableStatement cs, Object[] params)throws SQLException {
    ArrayList list = new ArrayList();
    for (int i = 0; i < params.length; i++) {
        String value = params[i] + "";
        if (value.startsWith("OracleTypes")) {
    if ("OracleTypes.CURSOR".equals(value)) {
        ResultSet rs = (ResultSet) cs.getObject(i + 1);
        list.add(covered(rs));
        closeAll(rs, null, null);
    } else {
        list.add(cs.getObject(i + 1));
    }
        }
    }
    return list;
         }
    });
    }
      

  3.   

    游标的效率低?何解?为什么同样的数据量在PL/SQL下测试,执行效率就高了10多信