2017-03-13 14 views
0

私は、Javaのコードは私のOracleデータベースに接続するには、Java 6とのojdbc14.jarを使用して、コードの下に使用したシーケンスIDを取得しようとして書かれている: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); 
    } 

私はきちんと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

あなたの声明、あなたの '近い()'メソッド、あなたの例外がある実際の場所を表示しません:あなたは、DBAアクセス権を持っている場合

は、あなたがオープン・カーソルを取得するには、次のクエリを使用することができます生成されたので、答えを出すのは難しいです。しかし、コードは無害に見えます。私はデータベースにカーソルをリストします。ドライバのバグにもなります(たとえば、DBメタデータのgetTablesには12.1.0.2ドライバのカーソルリークがあります)。 – eckes

+0

クエリで再帰呼び出しが生成されます。さらに、ログにはコード内でexecuteQuery()を呼び出すときに呼び出されるexecuteUpdate()メソッドがあります。どうして ?たぶんあなたの質問でそのことを説明できるかもしれません。したがって、クエリと** whole ** stacktraceを表示する必要があります。 – davidxxx

+0

正しいログをここに追加しました。私のcloseメソッドはstmt.close()を呼び出すことによってstmtを終了しています。私のデータベースはOracle 12cおよびJavaバージョン1.6で、ojdbc14.jarを使用しています。 –

答えて

0

、それは言う:

ORA-01000:最大オープン・カーソルは

オラクルを超えましたクエリにcursorを割り当てることができない場合、このエラーがスローされます。 Javaのコンテキストでは、カーソルはresultSetオブジェクトにマップされているため、通常、アプリケーションのどこかにresultSetのリークがあります。上記の例では

は、 close()方法は finallyブロックで呼び出され、仮定それは resultSetresultSetオブジェクト上 closeメソッドをinvoingにより)、あなたはどこ resultSetまたはアプリケーションの他の部分を見て、見つけるために必要がある場合があります閉じています preparedStatementは、クエリの実行後に閉じられません。

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; 
関連する問題