Java ora-00604:在ecursive SQL级别1发生错误?

Java ora-00604:在ecursive SQL级别1发生错误?,java,oracle,Java,Oracle,我使用java 6和ojdbc14.jar编写了java代码,以连接到我的oracle数据库,并尝试使用以下代码获取序列id: long lNewAuditId = 0; Statement stmt = null; ResultSet result = null; try { stmt = argConnection.createStatement(); result = stmt.executeQuery(SQL_NEXT_AUDI

我使用java 6和ojdbc14.jar编写了java代码,以连接到我的oracle数据库,并尝试使用以下代码获取序列id:

long lNewAuditId = 0;

    Statement stmt = null;
    ResultSet result = null;

    try {
        stmt = argConnection.createStatement();
        result = stmt.executeQuery(SQL_NEXT_AUDIT_ID);

        if ( !result.next() )
            throw new DAOException("Error obtaining new Audit Id - no result");

        lNewAuditId = result.getLong(1);
        m_logger.debug("Next Audit Id: " + lNewAuditId);

    } 
    catch (SQLException sqle) 
    {
        throw new DAOException("Error getting next Audit id", sqle);            
    } 
    finally 
    {
        // do not close the connection here
        close(result);
        close(stmt);
    }
我希望我正确地关闭stmt。运行此代码时,我面临以下问题:

java.sql.SQLException: ORA-01000: maximum open cursors exceeded

    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)
    at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:957)
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1062)
    at oracle.jdbc.driver.T4CStatement.executeMaybeDescribe(T4CStatement.java:841)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1134)
    at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1274)

如果您看到潜在错误,它会显示:

ORA-01000:超过最大打开游标数

Oracle无法为您的查询分配
光标时抛出此错误。在Java上下文中,游标映射到
resultSet
对象,因此这通常意味着您的应用程序中某处存在
resultSet
泄漏

在上面的示例中,
close()
方法在
finally
块中调用,并假设它关闭
resultSet
(通过对
resultSet
对象调用
close
方法),您可能需要查看应用程序的其他区域,找出执行查询后,
resultSet
preparedStatement
未关闭的位置

如果您具有dba访问权限,则可以使用以下查询来获取打开的游标:

select max(a.value) as highest_open_cur, p.value as max_open_cur
from v$sesstat a, v$statname b, v$parameter p
where a.statistic# = b.statistic# 
and b.name = 'opened cursors current'
and p.name= 'open_cursors'
group by p.value;

您没有显示您的语句、您的
close()
方法以及生成异常的实际位置,因此很难给出答案。然而,您的代码看起来确实是无辜的。我会在数据库中列出游标。也可能是驱动程序错误(例如,DB元数据的getTables在12.1.0.2驱动程序中有游标泄漏)。您的查询会生成一些递归调用。此外,在日志中,我们看到在代码中调用executeQuery()时调用了executeUpdate()方法。为什么?也许你的问题可以解释这一点。所以,您应该显示查询和整个stacktrace。我在这里添加了正确的日志。我的close方法是通过调用stmt.close()来关闭stmt。我的数据库是Oracle 12c和Java版本1.6,使用ojdbc14.jar.600错误通常意味着Oracle和底层O/s之间出现了问题。请检查Oracle日志-它通常会有其他错误或一些十六进制代码,指示支持问题的类型。这通常不是代码问题。