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: 超出最大打开游标

ORA-01000: 超出最大打开游标 - java 代码失败

jdbc 查询5万条数据出现 ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01000: 超出打开游标的最大数

Doctrine + Oracle = 超出最大打开游标 (ORA-01000)

使用 Oracle 的 Spring Boot 应用程序 - ORA-01000:超出最大打开游标 - 负载测试期间发生错误

java.sql.SQLException: ORA-01000: 超出打开游标的最大数