ORA-01000:使用oracle即时客户端和C#超出最大打开游标数

时间:2015-02-24 13:01:32

标签: c# oracle

我们的C#应用​​程序正在生成ORA-01000错误。我们使用的是ODP.Net,应用程序运行完美,没有任何ORA-01000错误。

我们删除了ODP.Net并安装了即时客户端(我们现在使用7个dll文件从C#连接到Oracle,这些文件是oci.dll,ociw32.dll,Oracle.DataAccess.dll,orannzsbb11.dll,oraocci11。 dll,oraociicus11.dll和OraOps11w.dll)。

从那时起,我们在执行具有多个查询的长进程时获得ORA-01000。注意到我们正在关闭/处置OracleDataReader对象。

ORA-01000与即时客户端背后的原因是什么?

6 个答案:

答案 0 :(得分:2)

使用此查询检查打开游标的限制:

SELECT NAME, VALUE DISPLAY_VALUE, ISDEFAULT
FROM V$PARAMETER
WHERE NAME = 'open_cursors';

在我看来,默认值是50,相当低。 请参阅文档:OPEN_CURSORS

要求你的DBA增加它,根据文档,没有额外的开销来设置这个值高于实际需要。

我刚用

检查了我的数据库
SELECT COUNT(*), user_name 
FROM V$OPEN_CURSOR
WHERE user_name = 'SYS'
GROUP BY user_name;

640打开游标仅限于SYS(一次会话中达到峰值113),即不是由我(可能是错误的)应用程序引起的。

答案 1 :(得分:1)

我知道这个问题已经有一年了,但我们只是遇到了同样的问题。我们所有与Oracle相关的对象都被关闭并处理掉了,而且游标仍然被泄露。

问题似乎是ODP.Net如何使用连接池。默认情况下,连接池处于打开状态,并且在我们的环境中,这始终会导致泄漏的游标重复发生,直到DB确定足够的并且拒绝授予更多。

解决方法是在连接字符串中禁用连接池,如下所示:

BeginInvoke

我们的应用程序在启动时使用了超过30个游标并稳步增加到200.现在禁用了连接池,它使用了2到3个游标。

答案 2 :(得分:0)

ORA-01000的唯一原因是打开过多的游标:)

检查V$OPEN_CURSOR视图并查看哪些游标已打开。了解它,你将能够确定它们为什么仍然被打开。

答案 3 :(得分:0)

Oracle文档注意到有关ORA-01000:

的信息

ORA-01000超出最大打开游标

原因:主机语言程序试图打开太多游标。初始化参数OPEN_CURSORS确定每个用户的最大游标数。

操作:修改程序以使用更少的游标。如果经常发生此错误,请关闭Oracle,增加OPEN_CURSORS的值,然后重新启动Oracle。

在我的例子中,它是非托管资源,如OracleCommand,OracleRefCursor和OracleDataReader。要最小化打开的服务器游标数,显式处置 OracleCommand,OracleRefCursor和OracleDataReader对象。

答案 4 :(得分:0)

在我们公司中,我们已经为这个问题苦苦挣扎了近两个星期。一次性的所有东西都已正确释放,但无济于事:ORA-01000问题仍然存在。

我们突然意识到:在一些经常调用的存储过程中,执行了以下代码:dbms_sql.open_cursor

此函数的危险之处在于它会创建一个新的游标,该游标仅以数字形式返回其句柄。离开范围后,Oracle无法识别该编号后面有一个句柄,必须将其释放。结果是每次调用dbms_sql.open_cursor时都会创建一个新的游标,只要会话处于活动状态,该游标就保持打开状态。由于我们使用了会话池,因此这些游标保持打开状态的时间非常长。

希望此提示会有所帮助。

答案 5 :(得分:0)

该问题是由于某些游标已打开但未关闭而引起的。

可能会导致两个问题(至少因为我所看到的)。在受约束的过程中某些显式打开的游标或者在.Net应用程序中没有关闭的DataReader。