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

bre*_*ter 2 java oracle11g ora-01000

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

ORA-01000: maximum open cursors exceeded
Run Code Online (Sandbox Code Playgroud)

我搜索了一下,看到在添加每行后关闭我准备好的语句或语句有助于摆脱错误.

但是,我需要了解 -

  1. 什么是游标?
  2. 我可以改变光标的数量吗?如果是的话,这是一件好事吗?

Ale*_*lex 7

此链接将向您解释光标是什么以及它是如何工作的.

是的,您可以使用以下语句更改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);
}
Run Code Online (Sandbox Code Playgroud)

结果集也是如此.根据您使用的Java版本,您可以使用try-with-resources惯用法.

try (Statement stmt = con.createStatement()) {
   // do something with the statement
} catch(SQLException e) {
   LOG.error("SQL error", e);
}
Run Code Online (Sandbox Code Playgroud)

try由于Statement实现了AutoCloseable接口,Java将负责在块结束时关闭语句.