和你连接有关系,rs和psmt
在Oracle初始化参数文件init.ora中修改:
processes和open_cursors的值,改大一点

解决方案 »

  1.   

    请教:zhangshunshi(宇轩) 能否说的详细点,我想从程序的角度彻底避免这个问题,rs和psmt用的不对吗?假如我在上面的循环后还要用到这个rs和psmt,应该何时关闭rs和psmt?能否提供例程给我参考.
    另外init.ora文件在哪里,我好像没找到。
      

  2.   

    oracle里面是有很多隐式游标的,比如一个update语句,就会使用到游标--虽然你没有自己去使用游标.
    你的循环里面执行的sql肯定使用了隐式游标.
    改变你的处理方法
      

  3.   

    如何判断是否使用了隐式游标以及如何才能避免隐式游标出现ORA-01000错?我的相关代码如下:
    try {
    String temp = null;
    String tempM = "M";
    String tempU = "U";
    String tempName = "通讯板";
    String faultName1[] =
    {
    "D6201",
    "D6209",
    "D62010",
    "D62011",
    "D62012",
    "D62013",
    "D62014",
    "D62015",
    "D62016" };
             String mtxb[] = { "", "", "", "", "", "", "", "", "" };
    querySQL =
      "select * from MONITOR_FAULT_VIEW where equipmentid = ? and  faultname = ?";
    psmt = conn.prepareStatement(querySQL);
             for (int j = 0; j < faultName1.length; j++) {
    //psmt = conn.prepareStatement(querySQL);
    psmt.setInt(1,deviceId);
    psmt.setString(2,faultName1[j]);
    rs = psmt.executeQuery();
    if (rs.next()) {
    mtxb[j] = rs.getString("tempresultvalue");

    }
    }
    rs.close();
    rs = null;
    psmt.close();
    psmt = null;
    int k = 0;
    String[] faultName2 =
    {
    "D6219",
    "D6202",
             "D6203",
    "D6204",
    "D6205",
    "D6206",
    "D6207",
    "D6208",
    "D62016" };
    String[] utxb = { "", "", "", "", "", "", "", "", "" };
    psmt = conn.prepareStatement(querySQL);
    for (int j = 0; j < faultName2.length; j++) {
    //querySQL =
    // "select * from MONITOR_FAULT_VIEW where equipmentid = ? and plcfaultname = ?";
    //psmt = conn.prepareStatement(querySQL);
    psmt.setInt(1,deviceId);
    psmt.setString(2,faultName2[j]);
    rs = psmt.executeQuery();
    if (rs.next()) {
    utxb[j] = rs.getString("tempresultvalue");
    }
    }
    while (k < 9) {
    Object[] data = new Object[4];
    if (k == 0) {
    data[0] = "面板通讯";
    data[1] = mtxb[k];
    data[2] = "一级主通讯故障";
    data[3] = utxb[k];
    rows2.add(data);
    k++;
    continue;
    }
    temp = tempM.concat(Integer.toString(k));
    temp = temp.concat(tempName);
    data[0] = temp;
    data[1] = mtxb[k];
    temp = tempU.concat(Integer.toString(k));
    temp = temp.concat(tempName);
    data[2] = temp;
    data[3] = utxb[k];
    rows2.add(data);
    k++;
    }
    rs.close();
    //rs = null;
    psmt.close();
    //smt = null;
    } catch (Exception e) {
    e.printStackTrace();
    }
      

  4.   

    在循环中要注意commit,比如5000个executequery提交一次,当然select除外
      

  5.   

    同意:jiezhi(西域浪子) 
    SELECT语句用于从数据库中查询数据一般都要用到游标:
    单条记录:select ... into ...  隐式游标
    多条记录:cursor 显式游标
    隐式游标在查询结束之后自动关闭,而显式游标则需要显式打开和关闭
      

  6.   

    注意适当地提交;另外找你们的数据库DBA调整初始化文件init.ora中的open_cursors等相关参数的值。
      

  7.   

    ORA-01000 maximum open cursors exceeded Cause: A host language program attempted to open too many cursors. The initialization parameter OPEN_CURSORS determines the maximum number of cursors per user. 
    Action: Modify the program to use fewer cursors. If this error occurs often, shut down Oracle, increase the value of OPEN_CURSORS, and then restart Oracle. 
      

  8.   

    多谢大家支持,不过我的程序如前面所列,只用到基本的select,没涉及到排序、更新或插入也注意关闭了记录集,且没有显示用到cursor,为什么仍然会有这个游标错出现?请大家顺便帮忙看看上面的代码是否有问题?