超出最大打开游标 - Oracle 11g | ibatis 2.3.4 |春天 3.0.3

Posted

技术标签:

【中文标题】超出最大打开游标 - Oracle 11g | ibatis 2.3.4 |春天 3.0.3【英文标题】:Max open cursors exceeded - Oracle 11g | ibatis 2.3.4 | spring 3.0.3 【发布时间】:2013-09-15 01:25:45 【问题描述】:

我们最近从 Sybase 迁移到 Oracle 11g 数据库。我们的应用程序使用 spring 3.0.3 和 IBATIS 2.3.4 与数据库交互。 最近,我们开始面临 ORA-01000 Maximum open cursors exceeded 异常。 我们与我们的 DBA 进行了交谈,他确认对于每一行插入,我们都占用了一个不正确的游标。游标大小由 DBA 设置为 300。

您能否建议我们如何通过 ibatis 配置或 Java 代码来处理这个问题? 我们从未遇到过 Sybase 的这个问题。

我们的 DAO 类中的当前代码结构:

try
    sqlMapClient.startTransaction();
    sqlMapClient.startBatch();

    for(...)
        sqlMapClient.insert(<in table 1>);
        sqlMapClient.insert(<in table 2>);
    

    sqlMapClient.executeBatchDetailed();
    sqlMapClient.commitTransaction();


catch(..)



finally

    sqlMapClient.endTransaction();


注意:我们不能执行中间提交,因为操作需要全部或无。

【问题讨论】:

【参考方案1】:

您可以使用以下语句来增加游标数量。只有 DBA 用户可以执行以下语句。每当您的 pl/sql 编码出现性能问题时,就会出现此问题。请尝试调整procedure / sql。

ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH;

【讨论】:

感谢您的建议,但是我们的 DBA 认为,与其增加光标大小,不如通过 iBatis 配置设置或通过 java 代码正确处理。原因是我们为每个插入使用了一个游标,而不是每批插入,这不是正确的方法。

以上是关于超出最大打开游标 - Oracle 11g | ibatis 2.3.4 |春天 3.0.3的主要内容,如果未能解决你的问题,请参考以下文章

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

ora-01000 - 超出最大打开游标错误

ORA-01000 - 超出最大打开游标 - Spring JDBC 3.2.5

Java 技术篇 - 连接oracle数据库执行sql使用close()关闭createStatement()无效无法清除游标缓存问题解决,报“ORA-01000: 超出打开游标的最大数“错误解决方法

跨线程共享的 django 连接导致 ora-01000 超出最大打开游标

ORA-01000: 超出最大打开游标错误