Java ora-00604:在ecursive SQL级别1发生错误?
我使用java 6和ojdbc14.jar编写了java代码,以连接到我的oracle数据库,并尝试使用以下代码获取序列id: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
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日志-它通常会有其他错误或一些十六进制代码,指示支持问题的类型。这通常不是代码问题。