我们的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与即时客户端背后的原因是什么?
答案 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。