【问题标题】:Too many cursors open打开的游标过多
【发布时间】:2020-05-12 06:57:21
【问题描述】:

使用 JUNIT,我多次调用存储过程 java 端(比如说 10 次)。在打了几个电话之后(比如说 7 七次),我有一个 java.sql.SQLException: ORA-01000: too many cursors open

我在一个plsql脚本中对Oracle端进行了相同数量的测试:当我调用这个程序10次或20次时没有问题,我使用的所有游标在我使用后都关闭了。

所以问题似乎出在 java 方面,虽然错误是 oracle 代码 (???)。

Java端,我用语句调用过程,得到resultSet:

cstmt = c.prepareCall("CALL myStoredProcedure(?,?,?,?)");
cstmt.setDate(1, sDate);
cstmt.setString(2, myVar);
cstmt.setString(3, myVar2);
cstmt.registerOutParameter(4, java.sql.Types.ARRAY, "My_TYPE_ITEMS");
cstmt.execute();

...

rs.close();
cstmt.close();

异常肯定发生在执行命令上。

有什么想法吗?

【问题讨论】:

  • 代码中的某个地方没有正确关闭 Statement 实例。

标签: java oracle stored-procedures


【解决方案1】:

PL/SQL 可能会自动关闭游标,而 JDBC 可能不会这样做:这可以作为解释。也可能是 Oracle OPEN_CURSORS 参数太低了。

这是 Oracle 的常见错误,已经在 java.sql.SQLException: - ORA-01000: maximum open cursors exceeded 中详细解释过

【讨论】:

  • OPEN_CURSOR 为 400。它在 7 次调用后停止...有点短。
  • 您是创建一个新的数据库会话还是重复使用一个?在数据库会话中运行测试之前,您有多少个打开的游标?您必须打开“黑匣子”才能了解发生了什么。
  • 如果我检查 v$session,我只会看到我的用户的一个会话。如果我选择 V$OPEN_CURSOR,它将返回 142 行
  • 要列出当前会话中打开的游标数量,请尝试:select sid, sql_text from v$open_cursor where sid = (select sys_context('USERENV','SID') from dual)。要检查实例级别的打开游标使用情况,请参阅docs.oracle.com/cd/E40329_01/admin.1112/e27149/…
  • 也许 JUNIT 打开了很多游标?如果测试运行很快,很难用 V$OPEN_CURSOR 手动检查:您需要运行另一个脚本来监控 V$OPEN_CURSOR 或跟踪 JDBC 或在会话上运行 SQL 跟踪:oracle-base.com/articles/misc/…
猜你喜欢
  • 2011-01-24
  • 1970-01-01
  • 2018-05-15
  • 2012-08-24
相关资源
最近更新 更多