ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Identity Manager管理者ガイド
11g リリース2 (11.1.2.2.0)
B69535-08
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

26 オープン・カーソルの問題のトラブルシューティング

Oracle Databaseをバックエンド・リポジトリとして使用するアプリケーションと同様、Oracle Identity ManagerではいくつかのSQL文が実行されます。Oracle DatabaseでのすべてのSQL文実行に対して、メモリ内の特定の領域が割り当てられます。Oracle PL/SQLを使用すると、この領域に名前を付けることができます。このプライベートなSQL領域は、コンテキスト領域またはカーソルと呼ばれます。これらのカーソルは、Oracle Databaseの必須メモリ・コンポーネントである共有プール内の領域(ライブラリ・キャッシュ内)を消費します。レネゲード・セッションによってライブラリ・キャッシュが占有されたり、膨大な解析要求でCPUがビジーになるのを防ぐには、OPEN_CURSORSデータベース・パラメータを設定してカーソルを制限する必要があります。

OPEN_CURSORSパラメータは、各セッションで開けるカーソルの最大数を設定します。たとえば、OPEN_CURSORSの値を1000に設定すると、各セッションは一度に最大1000個のカーソルを開くことができます。

場合によっては、データベース内のカーソル数が最大値を超え、次のエラーがスローされることがあります。

java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-01000: maximum open cursors exceeded ORA-00604: error occurred at recursive SQL level 1

オープン・カーソルの問題を解決するには、次の手順を実行します。

  1. データベースのSYSスキーマ(またはDBA権限を使用して任意のスキーマ)にログインします。

  2. 次のSQL文を使用して、エラーの原因となっているセッションを見つけます。

    select a.value, s.username, s.sid, s.serial# from v$sesstat a, v$statname b, v$session s where a.statistic# = b.statistic#  and s.sid=a.sid and b.name = 'opened cursors current' and s.username is not null;
    

    出力にすべてのセッションの詳細が表示されます。最大値を超えたセッションのIDを確認します。

  3. オープン・カーソルの最大数を超えた問合せを表示するには、次のSQL文を実行します。

    select  sid ,sql_text, count(*) as "OPEN CURSORS", USER_NAME from v$open_cursor where sid in ($SID);
    

    オープン・カーソルが最大数を超え、後続のカーソルが正常に閉じていない問合せが表示ます。

    SQL問合せ上で何らかのコードが実行されている場合、Javaの文、結果セットまたは接続が適切に閉じているかどうかをチェックします(それらがコードにアクセスする場合)。コードが接続を閉じていない場合は、開いているすべての接続を適切に閉じて、コード内のメモリ・リークを解消し、データベース・メモリの空きを増やします。

  4. OPEN_CURSORSパラメータの値が十分に高く設定されているかどうかを確認するには、次のようにv$sesstatでオープン・カーソルの最大値をモニターします。

    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;
    

    セッションが制限値に近づいている場合は、OPEN_CURSORSパラメータの値を増やします。