各位大虾:
    我有一个java应用,需要执行
    select user_id from tbl_user where state=0;
    由于这个语句有5000左右条记录,我处理
    while(rs.next())
    {
      //do things here
      ...
     
    }
 
    if(rs!=null)
       rs.close();
    rs=null;    程序在执行2、300条记录时报了
    ORA-01000: 超出打开游标的最大数
    这个错误。
    请问:我该如何解决?
          只能通过增大open_cursors来解决吗?

解决方案 »

  1.   

    show parameter open_cursors;
    看看相应的参数是多少,可以适当的改大点,不过出现这个错误一般都是应用程序里没有关闭游标的结果,重点检查你的应用程序
      

  2.   

    java里每次打开一个statement对象jdbc都会在数据库中打开一个游标来执行操作,做完业务后必须马上关闭,否则一旦多次打开且不关闭就会造成ORA-01000: 超出打开游标的最大数错误,如果需要循环建立statement对象最后统一提交,可以在循环里执行完活动马上关闭,关闭后业务处于未提交状态,直到执行connection.commit事件时活动才会提交.
    oracle数据库中open_cursors默认值为300,正常情况都够用了,出现ORA-01000错误基本都是有程序没关闭游标,多出现于java程序使用连接池连接数据库的情况下,打开了statement没关闭就把连接放回了连接池或者循环打开statement对象而不关闭,请仔细检查自己的程序代码
      

  3.   

    同意 adaizi1980(阿代)  的说法.
      

  4.   

    to adaizi1980(阿代) :
       谢谢你的答复。
       我也知道是应用出了问题,可如何在循环里关闭statement呢?
       我执行的sql有5000条纪录, 
       while(rs.next())
        {
          //do things here
          ...
         
        }
       如何在循环里关闭rs的statement呢?
      

  5.   

    你的
    do things部分如果没有
    mystatement = DBOperate.CreateSatement(conn) 
    之类的语句来创建新的statement对象,那么就不会消耗游标;
    但是如果有,一定要保证本次循环之前就执行DBOperate.CloseStatement(mystatement )
    而且在异常处理段一定要检查程序段中的statement对象是否已关闭,如果未关闭一定要关闭,否则会造成程序运行开始时没问题,运行一段时间后超出游标最大值的问题;
    总之,如果一运行某一段就出错,一定是该段有循环打开游标且不关闭的操作;
    如果只是碰巧到某处出现该错误,也有可能是其他程序段没有关闭游标,要检查全部代码;
    我们部门以前有个新人不怎么懂,结果就曾搞的系统不一定是谁的界面出问题,但是跑一阵子一定会游标耗尽,搞的我们检查了全部代码
      

  6.   

    其实这个问题去java区问最好,这是jdbc的基础问题
      

  7.   

    to adaizi1980(阿代) :
        do things 部分没有创建statement,只有循环外面用到了,
        难道每rs.next()一次,都会消耗一个游标?
        那怎么才合适呢?