2017-03-13 61 views
0

我有使用Java 6和ojdbc14.jar的連接到我的Oracle數據庫和嘗試使用下面的代碼來獲得序列ID java代碼寫的:ora-00604:在遞歸SQL級別1時發生錯誤?

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); 
    } 

我希望我正確關閉語句。雖然運行此代碼,我對着下面的問題:

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) 
+0

你不顯示你的說法,你的'接近()'方法,實際的地方,你的例外是生成,所以很難給出答案。然而你的代碼看起來很無辜。我會列出數據庫中的遊標。也可以是驅動程序錯誤(例如,DB元數據的getTables在12.1.0.2驅動程序中有遊標泄漏)。 – eckes

+0

您的查詢生成一些遞歸調用。此外,在日誌中,我們看到一個在代碼中調用executeQuery()時調用的executeUpdate()方法。爲什麼?也許你的查詢可以解釋這一點。所以,你應該顯示查詢和整個**堆棧跟蹤。 – davidxxx

+0

我在這裏添加了正確的日誌。我的close方法是通過調用stmt.close()來關閉stmt。我的數據庫是Oracle 12c和Java版本1.6,並使用ojdbc14.jar。 –

回答

0

如果你看到下面的錯誤,它說:

ORA-01000:最大打開的遊標超出

甲骨文當它無法爲您的查詢分配cursor時拋出此錯誤。在Java的上下文中,光標映射到對象,因此這通常意味着您的應用程序中某處存在resultSet泄漏。

在上面的例子中,close()方法被調用finally塊,並假設它關閉resultSet(由invoing上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; 
相關問題