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

Posted

技术标签:

【中文标题】ORA-01000: 超出最大打开游标 - java 代码失败【英文标题】:ORA-01000: maximum open cursors exceeded - java code fails 【发布时间】:2012-08-27 08:48:22 【问题描述】:

我在我的 java 代码中使用循环将行插入到我的数据库中。然后,我得到了错误 -

ORA-01000: maximum open cursors exceeded

我搜索了一下,发现在添加每一行后关闭我准备好的语句或语句有助于消除错误。

但是,我需要明白——

    什么是游标? 我可以更改游标的数量吗?如果是,这是一件好事吗?

【问题讨论】:

显然您没有正确关闭语句/游标。 关于“在添加每一行后关闭我的准备好的语句或语句有帮助”:如果是这样,那么你在循环中做了一些不好的事情,比如在每次迭代中重新创建 PreparedStatement 左右。一条规则是,您应该在创建的所有内容(语句、结果集等)上调用 close,但您还应该确保正确使用它们。在插入循环中,在大多数情况下,您希望重用在循环之前创建并在之后关闭的准备好的语句。增加打开游标的最大数量将“帮助”但不能解决问题,并且您将在以后遇到问题。 @a_horse_with_no_name - 你能推荐一些链接来教我如何正确关闭游标吗? 【参考方案1】:

This link 将向您解释什么是游标以及它是如何工作的。

是的,您可以使用以下语句更改 Oracle 上的最大游标数: ALTER SYSTEM SET OPEN_CURSORS=1337 SID='*' SCOPE=BOTH;

但如果真的需要,你应该这样做。您真正应该做的是正确处理结果集和语句,并确保始终关闭它们。这通常应在 try/finally 语句中完成。

如果您忘记关闭这些,打开的游标会泄漏,直到您达到最大限制(很快就会出现),并且后续请求将无法正常工作(您就是这种情况)。

您可以编辑您的问题并添加一些代码,以便我们可以向您展示一些提示,说明您可以如何以及在何处正确关闭结果集和语句。

这是典型的用法:

Statement stmt;
try 
   stmt = con.createStatement();
   // do something with the statement
 catch (SQLException e) 
   LOG.error("SQL error", e);
 finally 
   try  if (stmt != null) stmt.close();  catch (SQLException se)  LOG.error("Error closing the statement", se); 
   // if using Apache utils you could do
   // IOUtils.closeQuietly(stmt);

结果集也是一样。根据您使用的 Java 版本,您可以使用 try-with-resources 习惯用法。

try (Statement stmt = con.createStatement()) 
   // do something with the statement
 catch(SQLException e) 
   LOG.error("SQL error", e);

Java 将负责关闭 try 块末尾的语句,因为 Statement 实现了 AutoCloseable 接口。

【讨论】:

【参考方案2】:

这个应该只在应用程序处理,和数据库没有关系打开与否。类似地尝试关闭每个语句。请参阅此link 了解更多详细信息。

【讨论】:

我们如何做到这一点 - 在打开每个语句之前,检查它是否已经打开?【参考方案3】:

当您运行语句的 executeQuery 方法时,您正在创建一个游标。游标是在数据库中定义的,可以通过jdbc来控制。 您可以从以下网址找到更多信息。 wiki for cursor

【讨论】:

以上是关于ORA-01000: 超出最大打开游标 - java 代码失败的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

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