我面对的是
ORA-01000:最大打开游标超出
在IIS上承载ASP网页之后。当我用测试网页时。未发生最大打开游标超出问题。
用于关闭和取消连接的代码
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()我的用法正确吗?
发布于 2013-01-04 05:17:08
根据您对其他答案的响应,您的问题很可能是IIS web服务器正在使用连接池进行数据库连接。连接池将创建许多连接,从数据库的角度来看,它们将长期保持打开状态。它这样做是因为所做的假设是打开数据库连接相对于显示页面的时间而言是耗时的。
您需要检查IIS的配置,或者禁用连接池(不推荐),或者使池的大小变小。
发布于 2013-01-04 03:50:47
我不能告诉您,如果您正确使用asp或不正确,因为您张贴的代码是不完整的。但是,open_cursors init.ora参数决定了数据库会话一次可以打开多少游标。要确定您是在泄漏游标还是参数设置得太低,第一步是确定init.ora参数open_cursors的当前值。
确定哪些游标是打开的(可能忘记关闭)。您可以使用视图v$open_cursor。
发布于 2013-01-04 04:15:34
如果没有更多的代码,很难确定这里发生了什么,但我可以很好地猜测:,您没有正确地关闭连接!
对于数据库连接,在任何地方都可以手动调用.Close()或.Dispose(),这些调用必须位于finally块中(首选是为using语句创建的隐式最后块)。否则,如果数据库代码抛出任何异常,则可能跳过.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块自动为我们处理这个问题。
https://stackoverflow.com/questions/14150311
复制相似问题