我在我的 java 代码中使用循环将行插入到我的数据库中。然后,我得到了错误 -
ORA-01000: maximum open cursors exceeded
我搜索了一下,发现在添加每一行后关闭我准备好的语句或语句有助于消除错误。
但是,我需要明白——
- 什么是游标?
- 我可以更改游标的数量吗?如果是,这是一件好事吗?
此链接将向您解释什么是游标以及它是如何工作的。
是的,您可以使用以下语句更改 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
接口。
这应该只从应用程序处理。它与数据库无关。某些语句没有正确关闭。即使open_cursors=10000也会出现此错误。在打开每个语句之前,请检查它是否已经保持打开状态.Similarly 尝试关闭每条语句。有关更多详细信息,请参阅此链接。
当您运行语句的 executeQuery 方法时,您正在创建一个游标。游标是在数据库中定义的,可以通过jdbc来控制。您可以从以下网址找到更多信息。 游标维基