ORA-01000: 超出最大打开游标错误
Posted
技术标签:
【中文标题】ORA-01000: 超出最大打开游标错误【英文标题】:ORA-01000: maximum open cursors exceeded error 【发布时间】:2017-03-13 12:06:22 【问题描述】:我有以下代码:
using (System.Data.OracleClient.OracleConnection dataConn = new System.Data.OracleClient.OracleConnection(_connectionString))
using (System.Data.OracleClient.OracleCommand cmd = new System.Data.OracleClient.OracleCommand())
cmd.Connection = dataConn;
cmd.CommandText = "DELETE FROM Employees WHERE LOCATIONID= :LOCATIONID";
cmd.Parameters.AddWithValue(":LOCATIONID", locationId);
dataConn.Open();
retVal += cmd.ExecuteNonQuery();
dataConn.Close();
using (System.Data.OracleClient.OracleCommand cmd = new System.Data.OracleClient.OracleCommand())
cmd.Connection = dataConn;
cmd.CommandText = string.Format("DELETE FROM Locations WHERE LocationId = :LOCATIONID";
cmd.Parameters.AddWithValue(":LOCATIONID", locationId);
dataConn.Open();
retVal += cmd.ExecuteNonQuery();
dataConn.Close();
仅供参考,
我在 50 次迭代的循环中调用上述块。 在每次迭代中,我都会传递一个新的 locationid。 - 对于每次迭代,第一个查询可能会删除 avg 上的 500 条记录,因为一个位置分配给 500 多名员工。根据this 链接:,我认为我做的事情是正确的,谁能指出为什么我仍然收到 ORA-01000: maximum open cursors exceeded 错误? 任何帮助将不胜感激。 谢谢。
【问题讨论】:
请您的 DBA 增加 OPEN_CURSORS 的值。我认为默认值 50 相当低。特别是它说:将此值设置为高于实际需要的值不会增加开销。 【参考方案1】:根据您帖子中链接中接受的答案 (ORA-01000: maximum open cursors exceeded in asp.net),当您调用 dataConn.Close() 时,连接并没有真正关闭,而是在连接池中保持打开状态。这是一个隐藏的优化,可以更快地打开其他连接,但是当您超过某些限制时可能会导致 Oracle 出现问题。我建议您研究限制连接池大小的方法 - 这取决于托管您的代码的内容(IIS?其他什么?)。
您也可以将您的 SQL 更改为“从表中删除键在其中(...值列表...)”。这将消除打开 50 个逻辑连接的需要(谁知道有多少物理连接——可能很多)。
或者在 dataConn.Open...dataConn.Close 中进行循环——只需对所有 cmd 使用相同的打开连接。
编辑:根据您使用的数据提供者,连接池的大小可以从连接字符串中控制。示例见https://msdn.microsoft.com/en-us/library/ms254502(v=vs.110).aspx。
【讨论】:
我正在使用 IIS,有什么可以在那里调查的吗?以上是关于ORA-01000: 超出最大打开游标错误的主要内容,如果未能解决你的问题,请参考以下文章
ORA-01000: 超出最大打开游标 - java 代码失败
jdbc 查询5万条数据出现 ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01000: 超出打开游标的最大数
Doctrine + Oracle = 超出最大打开游标 (ORA-01000)
使用 Oracle 的 Spring Boot 应用程序 - ORA-01000:超出最大打开游标 - 负载测试期间发生错误