我正面临
ORA-01000:超出最大打开游标数
在IIS上托管ASP网页后。当我用visual studio测试网页时。最大打开游标超出问题不会发生。
我用来关闭&取消连接
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()
我的用法是否正确?
答案 0 :(得分:2)
根据您对其他答案的回答,您的问题很可能是IIS Web服务器正在使用连接池进行数据库连接。连接池将创建许多连接,从数据库的角度来看,它们会长时间保持打开状态。这样做是因为假设打开数据库连接相对于显示页面的持续时间而言是耗时的。
您需要查看IIS的配置并禁用连接池(不推荐),或者缩小池大小。
答案 1 :(得分:0)
如果您正确使用asp,我无法告诉您,因为您发布的代码不完整。但是,open_cursors init.ora参数确定一次可以由数据库会话打开多少游标。要确定是否泄漏游标或参数设置得太低,第一步是确定init.ora参数open_cursors的当前值。
确定哪些游标是打开的(可能忘记关闭)。你可以使用view v $ open_cursor。
答案 2 :(得分: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
块会自动为我们处理。
答案 3 :(得分:0)
我有一个批处理,它使用相同的oracle连接向bd做了很多请求。要解决此问题,我在rdr.read()之后关闭了我的ref_cursor。它对我有用。只是rdr.close()
答案 4 :(得分: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();