我在java代码中使用循环将行插入到数据库中。然后,我发现了错误-
ORA-01000: maximum open cursors exceeded我搜索了一下,发现在添加每一行后关闭准备好的语句或语句有助于消除错误。
但是,我得明白-
发布于 2012-08-27 09:05:05
这个链接将解释光标是什么以及它是如何工作的。
是的,可以使用以下语句更改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 (Statement stmt = con.createStatement()) {
// do something with the statement
} catch(SQLException e) {
LOG.error("SQL error", e);
}Java将负责关闭try块末尾的语句,因为语句实现了AutoCloseable接口。
发布于 2012-08-27 09:05:41
这应该从应用程序only.It处理,与database.Some无关的语句不关闭properly.Even如果open_cursors=10000,此错误将occur.Before打开每条语句,检查它是否已经打开,或者not.Similarly试图关闭每个statement.See的更多细节。
发布于 2012-08-27 09:13:33
当您运行方法executeQuery of语句时,您将创建一个游标。游标是在数据库中定义的,可以通过jdbc进行控制。您可以在下面的url中找到更多信息。用于光标的wiki
https://stackoverflow.com/questions/12138806
复制相似问题