能不能rollback或者commit一下,游标就无效了

解决方案 »

  1.   

    这是我比较困惑的问题,从mysql转到oracle,还没完全适应过来。init.ora中默认游标数是300,应该也不少了。那些隐式的游标是怎么工作的,不能自己释放吗
      

  2.   

    可以把 oracle 中控制打开游标数的变量设置的大一点,参数好像事 open_cursor 默认是 300,设置为 1000 应该够用了
      

  3.   

    我改了一下存储参数,把下一扩展区值改为1M(初始扩展区大小没改,是128k),发现情况好点,两个人同时按住F5刷新,过了十几秒(先前是一个人按住十几秒)后用select count(*) from v$open_cursor 查看了一下,发现游标数打开已经超过300,刚好数据库down掉。但是很快游标又被释放出去剩下十几个。这样看来,增加游标数是必须的了。
      

  4.   

    一次查询完了,不光ResultSet要关闭,其他的connection, statement也要关闭,关闭的时候注意把关闭的操作放在finally中。关闭时候按照ResultSet, statement,connection的顺序来,并且要注意,不要出现因为关闭ResultSet出错,而导致关闭statement,connection的操作未被执行的情况。
      

  5.   

    几乎可以肯定的说,这是程序的问题.除了用上面的方法之外,还可以考虑缓存connection,statement的办法,将过期未关闭的connection,statement强制关闭。
      

  6.   

    没有使用过程,我是在公共类一个方法里面,从连接池获得一个连接,然后用jdbc创建statement执行查询语句,返回一个结果集.象这样:
    public ResultSet getRS(String sql) {
     ResultSet rs = null;
     ConnectionPool tPool = this.APool;
     if(!tPool=null) {
     try {
      Statement Stmt = tPool.createStatement();
      rs = Stmt.executeQuery(sSql);
      Stmt.close();
      Stmt = null;
      } catch (Exception ex) {
      System.out.println("Error sql:"+sql);
      ex.printStackTrace();

    } else {///}return rs;}
    然后就是在程序中调用这个方法,获得一个结果集,在try {}块中rs.close();rs=null;问题是Statement不是对应显式游标的吗?我把语句和结果集都关闭了,但是从select
    count(*) from v$open_cursor来看,游标数飚升的非常快,一下子就达到最大数溢出了
      

  7.   

    这个地方有问题
    -------------------------------
    rs = Stmt.executeQuery(sSql);
    Stmt.close();
    -------------------------------
    当Stmt.executeQuery(sSql);抛出SQLException时,Stmt.close();不会被执行到。
    正确的做法是
    try
    {
    ...
    rs = Stmt.executeQuery(sSql);
    ...
    }
    catch(SQLException e)
    {
    }
    finally
    {
    Stmt.close();
    }
      

  8.   

    Stmt.close()放在finally里会提示sqlexception没有捕获正确的关闭次序应该是resultset,statement,connection,而在我上面rs和stmt的关闭次序颠倒过来了
      

  9.   

    我觉的问题是在于你编程的问题。
    java程序中,在一个循环中,使用createStatement();就可有可能引起这类问题。
    最好的,应该是使用preparedstatement,循环中,是设置查询参数。
      

  10.   

    还有,我觉得你这样,把ResultSet返回去的做法有问题,一般是直接这样,
    try
    {
    ...
    rs = Stmt.executeQuery(sSql);
    while(rs.next()){
      Row row = new Row();
      ...//取得数据
      data.add(row);
    }
    ...
    }
    catch(SQLException e)
    {
    }
    finally
    {
    rs.close();
    Stmt.close();
    }
      

  11.   

    弄了一个下午,现在终于有点头绪了,谢谢各位。
    to: sijian2001(海阔天空),直接返回resultset的做法有什么弊端呢?
    看来有时间得把某些公共类优化一下了。另外谢谢你耐心的回答。to: enhydraboy(乱舞的浮尘),你说的不错,我现在返回去看代码,发现有些地方,
    比如在一个while(rs.next()){}块中还产生了另一个resultset,即循环调用了createStatement(),现在改为用一条比较复杂的sql查询到所有需要的数据,产生的游标数就少了好多。查了一些资料,好象是说jdbc的close()方法是软关闭,在cache中还要留一些时间。而一个session中可以打开的游标数跟open_cursor有关,目前还是暂时先把它设为1000看看。