在Delphi下面正常使用ADo访问 Oracle(8i)数据库,出现异常,异常内容是ORA-01000: maximum open cursors exceeded,我修改了程序,每次打开ADoQuery,使用完毕后关闭ADoquery,再程序结束的时候关闭ADoConnection,可是仍然经常出现上面大的异常,我再网上查了一下说是同时打开的游标太多导致的,不知道如何避免该错误的发生?
我使用的Oracle的版本为Oracle8i, 如何修改让数据库可以打开的cursors数目大一些?好像initORCL.ora文件里面也没有关于Open_cursor的选项啊,我刚刚重启了机器,然后运行PL/SQL查询一下: select * from v$parameter where name='open_cursors' 查询出来的结果是Value=50,这个值是允许打开的最大游标数还是已经打开的游标数啊,照道理应该机器重启了,打开的游标数为0才对啊
谢谢各位,我在InitORCL.ora文件里面加上了 open_cursors=500,然后重启了Oracle服务器,现在程序运行正常。 但是我实在不明白是在哪里打开了那么的cursor,我的客户端程序只用了一个DbConnection,而且,每次使用完数据集后就及时关闭了,读取数据库内容的代码类似下面的: SQLText:='SELECT * FROM PointInfo '; FDBConn.MyOpenSQLText(FDataDm.ADOQuery,SQLText); with FDataDM.ADOQuery do begin Try WHILE NOT EOF do begin PointObj:=TPointObject.Create; PointObj.PointCode:=FieldByName('Code').AsString; FList.Add(PointObj); Next; end; Finally FDataDM.ADOQuery.Close; end; end;其中FDBConn.MyOpenSQLText(FDataDm.ADOQuery,SQLText);是自己定义的一个函数,用来打开数据集,加入了异常处理,不知道以后数据量大的情况下还会不会发生类似的问题。 这段代码在MSSQL数据库里运行是完全正常的,没有任何问题。
select * from v$parameter where name='open_cursors' 查询出来的结果是Value=50,这个值是允许打开的最大游标数还是已经打开的游标数啊,照道理应该机器重启了,打开的游标数为0才对啊
你可以先把游标数根据系统业务量增大,如果还不行或者本身系统只处于开发/测试阶段没多少业务的话,那就好好检查代码吧
*.open_cursors=300
没有的话加上条试下看(一定要大于300,因为默认的就是300)
open_cursors=500,然后重启了Oracle服务器,现在程序运行正常。
但是我实在不明白是在哪里打开了那么的cursor,我的客户端程序只用了一个DbConnection,而且,每次使用完数据集后就及时关闭了,读取数据库内容的代码类似下面的: SQLText:='SELECT * FROM PointInfo ';
FDBConn.MyOpenSQLText(FDataDm.ADOQuery,SQLText);
with FDataDM.ADOQuery do
begin
Try
WHILE NOT EOF do
begin
PointObj:=TPointObject.Create;
PointObj.PointCode:=FieldByName('Code').AsString;
FList.Add(PointObj);
Next;
end;
Finally
FDataDM.ADOQuery.Close;
end;
end;其中FDBConn.MyOpenSQLText(FDataDm.ADOQuery,SQLText);是自己定义的一个函数,用来打开数据集,加入了异常处理,不知道以后数据量大的情况下还会不会发生类似的问题。
这段代码在MSSQL数据库里运行是完全正常的,没有任何问题。