首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-01000:超出最大打开游标- java代码失败

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

Stack Overflow用户
提问于 2012-08-27 08:48:22
回答 3查看 44.5K关注 0票数 2

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

代码语言:javascript
复制
ORA-01000: maximum open cursors exceeded

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

但是,我得明白-

  1. 什么是游标?
  2. 我能改变游标的数目吗?如果是,这是一件好事吗?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-27 09:05:05

这个链接将解释光标是什么以及它是如何工作的。

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

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

如果您忘记关闭这些,打开游标会泄漏,直到达到最大值(很快就会到来),随后的请求将无法工作(这就是您的情况)。

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

这是典型的用法:

代码语言:javascript
复制
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版本的不同,您可以使用“用资源进行尝试”的成语。

代码语言:javascript
复制
try (Statement stmt = con.createStatement()) {
   // do something with the statement
} catch(SQLException e) {
   LOG.error("SQL error", e);
}

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

票数 7
EN

Stack Overflow用户

发布于 2012-08-27 09:05:41

这应该从应用程序only.It处理,与database.Some无关的语句不关闭properly.Even如果open_cursors=10000,此错误将occur.Before打开每条语句,检查它是否已经打开,或者not.Similarly试图关闭每个statement.See的更多细节。

票数 3
EN

Stack Overflow用户

发布于 2012-08-27 09:13:33

当您运行方法executeQuery of语句时,您将创建一个游标。游标是在数据库中定义的,可以通过jdbc进行控制。您可以在下面的url中找到更多信息。用于光标的wiki

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12138806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档