我们的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背后的原因可能是什么?
发布于 2015-02-24 22:01:27
使用以下查询检查打开的游标的限制:
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 ),即不是由我的(可能是坏的)应用程序引起的。
发布于 2016-09-16 22:06:16
我知道这个问题已经有一年之久了,但我们刚刚遇到了同样的问题。所有与Oracle相关的对象都已关闭并被释放,但游标仍然会泄漏。
问题似乎出在ODP.Net如何使用连接池。连接池在默认情况下是打开的,在我们的环境中,这似乎总是会导致游标泄漏,这种情况会反复发生,直到DB决定足够了,并拒绝再授予。
解决方法是在连接字符串中禁用连接池,如下所示:
Data Source=myOracle;User Id=myUsername;Password=myPassword;Pooling=False;我们的应用程序在启动时使用了超过30个游标,并稳步增加到200个。现在连接池被禁用了,它使用2到3个游标。
发布于 2015-02-24 22:07:17
Oracle文档注意到了ORA-01000的这一点:
ORA-超过01000个最大打开游标数
原因:主机语言程序试图打开太多游标。初始化参数OPEN_CURSORS确定每个用户的最大游标数量。
操作:修改程序以使用较少的游标。如果此错误经常发生,请关闭Oracle,增加OPEN_CURSORS的值,然后重新启动Oracle。
在我的例子中,它是非托管资源,如OracleCommand、OracleRefCursor、OracleGlobalization和OracleDataReader。为了最大限度地减少打开的服务器游标的数量,显式地释放了 OracleCommand、OracleRefCursor、OracleGlobalization和OracleDataReader对象。
https://stackoverflow.com/questions/28696528
复制相似问题