Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ORA-01000:超过最大打开游标数-java代码失败_Java_Oracle11g_Ora 01000 - Fatal编程技术网

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

ORA-01000:超过最大打开游标数-java代码失败,java,oracle11g,ora-01000,Java,Oracle11g,Ora 01000,我在java代码中使用循环将行插入数据库。然后,我得到了错误- ORA-01000: maximum open cursors exceeded 我搜索了一下,发现在添加每一行后关闭准备好的语句有助于消除错误 但是,我需要理解- 什么是游标 我可以更改光标的数量吗?如果是,这是一件好事吗 将向您解释什么是光标以及它是如何工作的 是,您可以使用以下语句更改Oracle上的最大游标数: ALTER SYSTEM SET OPEN_CURSORS=1337 SID='*'SCOPE=BOTH 但如果

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

ORA-01000: maximum open cursors exceeded
我搜索了一下,发现在添加每一行后关闭准备好的语句有助于消除错误

但是,我需要理解-

  • 什么是游标
  • 我可以更改光标的数量吗?如果是,这是一件好事吗 将向您解释什么是光标以及它是如何工作的

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

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

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

    您可以编辑您的问题并添加一些代码,这样我们就可以向您显示一些提示,说明如何以及在何处正确关闭resultset和语句

    这是典型的用法:

    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
    块末尾关闭语句,因为语句实现了
    AutoCloseable
    接口。

    这应该只从应用程序处理。它与数据库无关。有些语句没有正确关闭。即使open\u cursors=10000,将发生此错误。在打开每个语句之前,请检查它是否已保持打开状态。同样,请尝试关闭每个语句。有关详细信息,请参阅此。运行语句的方法executeQuery时,您正在创建一个游标。游标在数据库中定义,可由jdbc控制。 您可以从以下url中找到更多信息。

    显然,您没有正确地关闭语句/游标。关于“在添加每一行后关闭我准备好的语句或语句有帮助”:如果这样做,您在循环中做了一些不好的事情,比如在每次迭代中重新创建PreparedStatement等等。有一条规则是,您应该对创建的所有内容(语句、结果集等)调用close,但也应该确保正确使用它们。在插入循环中,在大多数情况下,您希望重用在循环之前创建并在循环之后关闭的准备好的语句。增加打开的游标的最大数量将“有帮助”,但不会解决问题,您将在稍后某个时间到达顶点。@a_horse_与_no_name-您能否建议一些链接,教我如何正确关闭游标?我们如何做到这一点-在打开每个语句之前,检查它是否已打开?