我在我的java代码中使用循环将行插入到我的数据库中。然后,我收到了错误 -
ORA-01000: maximum open cursors exceeded
我搜索了一下,看到在添加每行后关闭我准备好的语句或语句有助于摆脱错误。
但是,我需要明白 -
答案 0 :(得分:7)
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);
}
由于Statement实现了try
接口,因此Java将负责关闭AutoCloseable
块末尾的语句。
答案 1 :(得分:3)
这应该只从应用程序处理。它与数据库无关。某些语句没有正确关闭。即使open_cursors = 10000,也会发生此错误。在打开每个语句之前,检查它是否已经离开是否打开。同样尝试关闭每个语句。请参阅此link以获取更多详细信息。
答案 2 :(得分:0)
当您运行方法executeQuery of statement时,您正在创建一个游标。游标在数据库中定义,可以由jdbc控制。 您可以从以下网址中找到更多信息。 wiki for cursor