0

我面对

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

在 IIS 上托管 ASP 网页后。当我用 Visual Studio 测试网页时。最大打开游标超出问题不会发生。

  1. 问题的原因是什么以及我该如何解决
  2. 当我关闭并释放 Oracle 连接时,打开的游标会自动关闭吗?如果没有,我该如何关闭它们?

我用来关闭和释放连接的代码

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()

我的用法正确吗?

4

5 回答 5

2

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

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

于 2013-01-04T05:17:08.457 回答
0

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

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

于 2013-01-04T03:50:47.450 回答
0

如果没有更多代码,很难说这里会发生什么,但我可以做出一个很好的猜测: 你没有正确关闭你的连接!

任何你看到手动调用 .Close() 或 .Dispose() 关于数据库连接的地方,这些调用必须位于一个finally块中(优先考虑,为using语句创建的隐式 finally 块)。否则,如果您的数据库代码引发任何异常,您可能会跳过 .Close() 调用,从而使连接保持打开状态,因此容易受到诸如最大打开游标问题之类的影响。

它应该看起来更像这样:

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块会自动为我们处理这些问题。

于 2013-01-04T04:15:34.260 回答
0

我有一批使用相同的 oracle 连接对 bd 进行许多请求。为了解决这个问题,我在 rdr.read() 之后关闭了我的 ref_cursor。这对我有用。只需 rdr.close()

于 2015-02-25T14:00:05.120 回答
0

处理 OracleCommand:

OracleCommand cmd = new OracleCommand();
cmd.Dispose();

但是,您还需要处理和关闭 OracleDataReader:

OracleDataReader DataReader = Util.ExecuteDataForQuery(); // this returns the OracleDataReader object
// use it for your purpose
DataReader.Close();
DataReader.Dispose();
于 2016-11-30T17:28:48.527 回答