各位大虾:
我有一个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来解决吗?
我有一个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来解决吗?
看看相应的参数是多少,可以适当的改大点,不过出现这个错误一般都是应用程序里没有关闭游标的结果,重点检查你的应用程序
oracle数据库中open_cursors默认值为300,正常情况都够用了,出现ORA-01000错误基本都是有程序没关闭游标,多出现于java程序使用连接池连接数据库的情况下,打开了statement没关闭就把连接放回了连接池或者循环打开statement对象而不关闭,请仔细检查自己的程序代码
谢谢你的答复。
我也知道是应用出了问题,可如何在循环里关闭statement呢?
我执行的sql有5000条纪录,
while(rs.next())
{
//do things here
...
}
如何在循环里关闭rs的statement呢?
do things部分如果没有
mystatement = DBOperate.CreateSatement(conn)
之类的语句来创建新的statement对象,那么就不会消耗游标;
但是如果有,一定要保证本次循环之前就执行DBOperate.CloseStatement(mystatement )
而且在异常处理段一定要检查程序段中的statement对象是否已关闭,如果未关闭一定要关闭,否则会造成程序运行开始时没问题,运行一段时间后超出游标最大值的问题;
总之,如果一运行某一段就出错,一定是该段有循环打开游标且不关闭的操作;
如果只是碰巧到某处出现该错误,也有可能是其他程序段没有关闭游标,要检查全部代码;
我们部门以前有个新人不怎么懂,结果就曾搞的系统不一定是谁的界面出问题,但是跑一阵子一定会游标耗尽,搞的我们检查了全部代码
do things 部分没有创建statement,只有循环外面用到了,
难道每rs.next()一次,都会消耗一个游标?
那怎么才合适呢?