首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-01000: asp.net中超出的最大打开游标

ORA-01000: asp.net中超出的最大打开游标
EN

Stack Overflow用户
提问于 2013-01-04 02:34:21
回答 5查看 6.3K关注 0票数 0

我面对的是

ORA-01000:最大打开游标超出

在IIS上承载ASP网页之后。当我用测试网页时。未发生最大打开游标超出问题。

  1. 问题发生的原因是什么?我如何解决?
  2. 当我关闭并取消Oracle连接时,打开的游标会自动关闭吗?如果没有,我怎样才能关闭它们?

用于关闭和取消连接的代码

代码语言:javascript
复制
rdr.Close()
rdr.Dispose()
cmd.Connection.Close()
cmd.Connection.Dispose()
For Each para As OracleParameter In cmd.Parameters
    para.Dispose()
Next
cmd.Dispose()
con.Close()
con.Dispose()

我的用法正确吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-01-04 05:17:08

根据您对其他答案的响应,您的问题很可能是IIS web服务器正在使用连接池进行数据库连接。连接池将创建许多连接,从数据库的角度来看,它们将长期保持打开状态。它这样做是因为所做的假设是打开数据库连接相对于显示页面的时间而言是耗时的。

您需要检查IIS的配置,或者禁用连接池(不推荐),或者使池的大小变小。

票数 2
EN

Stack Overflow用户

发布于 2013-01-04 03:50:47

我不能告诉您,如果您正确使用asp或不正确,因为您张贴的代码是不完整的。但是,open_cursors init.ora参数决定了数据库会话一次可以打开多少游标。要确定您是在泄漏游标还是参数设置得太低,第一步是确定init.ora参数open_cursors的当前值。

确定哪些游标是打开的(可能忘记关闭)。您可以使用视图v$open_cursor。

票数 0
EN

Stack Overflow用户

发布于 2013-01-04 04:15:34

如果没有更多的代码,很难确定这里发生了什么,但我可以很好地猜测:,您没有正确地关闭连接!

对于数据库连接,在任何地方都可以手动调用.Close()或.Dispose(),这些调用必须位于finally块中(首选是为using语句创建的隐式最后块)。否则,如果数据库代码抛出任何异常,则可能跳过.Close()调用,从而使连接处于打开状态,从而容易受到诸如最大打开游标问题的影响。

它应该更像这样:

代码语言:javascript
复制
using (var con = new OracleConnection(...))
using (var cmd = new OracleCommand(" sql here ", con))
{
    cmd.Parameters.Add( ... ).Value = ...

    using (var rdr = cmd.ExecuteReader())
    {
        while (rdr.Read())
        {
            //...
        }
    }
}

我知道我跳过了里面的一些东西(.),但这就是要点。我没有跳过对.Close()或.Dispose()的任何调用。using块自动为我们处理这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14150311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档