超出最大游标 SQLException--配置问题或游标泄漏?

Posted

技术标签:

【中文标题】超出最大游标 SQLException--配置问题或游标泄漏?【英文标题】:Maximum Cursors exceeded SQLException-- Configuration problem or Cursor leak? 【发布时间】:2019-06-11 09:08:58 【问题描述】:

我正在通过 Java 调用 SQL 过程。我在执行代码时在日志中收到 SQL 异常- java.sql.SQLException: ORA-01000: 超出最大打开游标

我已经经历过类似的问题并尝试过这个-

    将 open_cursors 从 30000 增加到 40000。 关闭 try 和 finally 块中的语句。

但这并没有解决问题。我的代码有问题吗?

这是我的 Java 代码-

public static void buildingHelpContent(String p_id) throws Throwable
        Connection conn = ExtractHP.getConnection();
        CallableStatement cs = null;
        log.debug("arguments for COMP.Help.build_hp_data  p_id=  "+p_id);
        try 
            cs = conn.prepareCall("call COMP.Help.build_hp_data(?)");
            cs.setString(1, p_id);
            cs.execute();
            if(cs!=null)            
                cs.close();

         catch (SQLException e) 
            log = ExtractHP.getLogger();
            log.debug("!!! Java Exception !!!\n");
            log.error("Exception while executing the procedure for ID ...."+ p_id, e);          
        
        finally
            if(cs!=null)
                cs.close();
        
    

【问题讨论】:

我认为问题出在您的 sql 代码中。 既然您已经向finally 块添加了close 调用,我建议您从try 块中删除close 代码。正如@user7294900 所说,将if(conn!=null) conn.close(); 添加到finally 块中。 this question 的答案可能对您有所帮助 嗨@BobJarvis 我添加了 conn.close();在 finally 块中。但现在低于异常:java.sql.SQLException: Closed Connection 【参考方案1】:

你没有关闭连接,你可以使用try-with-resources块(不带finally):

    log.debug("arguments for COMP.Help.build_hp_data  p_id=  "+p_id);
    try (Connection conn = ExtractHP.getConnection();
        CallableStatement cs = conn.prepareCall("call COMP.Help.build_hp_data(?)"))

在 java 6 中也关闭finally 中的连接:

finally
        if(cs!=null)
            cs.close();
        if(conn!=null)
            conn.close();
    

【讨论】:

感谢您的回复。不幸的是,这段代码非常古老,并且是用 Java 1.6 编写的。不能使用 try-with-resources。 @RichaSharma 查看我的更新答案,将conn.close(); 添加到finally +1 为您的建议@user7294900。在 finally 块中添加 conn.close() 后,现在我得到了一个新异常: java.sql.SQLException: Closed Connection 使用 Throw 和 Throwable 的 Java 代码有什么问题吗? @RichaSharma 我建议你用ExtractHP.getConnection()中的代码打开一个新问题

以上是关于超出最大游标 SQLException--配置问题或游标泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException: ORA-01000: 超出打开游标的最大数

java.sql.SQLException: - ORA-01000: 超过最大打开游标

java.sql.SQLException: - ORA-01000: 超过最大打开游标

java.sql.SQLException: - ORA-01000: 超过最大打开游标

java.sql.SQLException: - ORA-01000: 超过最大打开游标

java.sql.SQLException: - ORA-01000: 超过最大打开游标