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
オープン・カーソルの問題を解決するには、次の手順を実行します。
データベースのSYSスキーマ(またはDBA権限を使用して任意のスキーマ)にログインします。
次の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を確認します。
オープン・カーソルの最大数を超えた問合せを表示するには、次のSQL文を実行します。
select sid ,sql_text, count(*) as "OPEN CURSORS", USER_NAME from v$open_cursor where sid in ($SID);
オープン・カーソルが最大数を超え、後続のカーソルが正常に閉じていない問合せが表示ます。
SQL問合せ上で何らかのコードが実行されている場合、Javaの文、結果セットまたは接続が適切に閉じているかどうかをチェックします(それらがコードにアクセスする場合)。コードが接続を閉じていない場合は、開いているすべての接続を適切に閉じて、コード内のメモリ・リークを解消し、データベース・メモリの空きを増やします。
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
パラメータの値を増やします。