我面对
ORA-01000:超过的最大打开游标数
在IIS上托管ASP网页之后。当我用visualstudio测试网页时。超过最大打开游标数的问题不会发生。
- 问题发生的原因是什么;我该怎么解决
- 当我关闭并显示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()
我的用法正确吗?
根据您对其他答案的回答,您的问题很可能是IIS web服务器正在使用连接池进行数据库连接。连接池将创建许多连接,并且从数据库的角度来看,可以使它们长时间保持打开状态。它这样做是因为假设打开数据库连接相对于显示页面的持续时间来说是耗时的。
您需要查看IIS的配置,然后禁用连接池(不推荐使用(,或者缩小池大小。
如果没有更多的代码,很难说这里发生了什么,但我可以很好地猜测:您没有正确关闭连接
无论您在哪里看到关于数据库连接的对.Close((或.Dispose((的手动调用,这些调用MUST都必须位于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
块会自动为我们处理这些问题。
我不能告诉你是否正确使用了asp,因为你发布的代码不完整。然而,open_curs init.ora参数决定了数据库会话一次可以打开多少个游标。要确定是泄漏了游标,还是参数设置得太低,第一步是确定init.ora参数open_cursors的当前值。
确定哪些游标是打开的(可能忘记关闭(。您可以使用视图v$opencursor。
我有一个批处理,用相同的oracle连接向bd进行许多请求。为了解决这个问题,我在rdr.read((之后关闭了我的ref_cursor。这对我来说很有效。只需rdr.close((
处置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();