■過去事例
過去事例では、以下の場合に本事象が発生することを確認しています。
・PSP の入力を消費しない処理を実行している
・コネクションプールを使用している
■仕様説明
▼PSP の入力を消費しない処理について
スクリプト変数への値の代入では PSP の入力を消費しません。
このため、例えば以下のような処理で、ドキュメントMapper ではスクリプト変数への値の代入のみを行っている場合、PSP の入力が消費されないため、カーソルを保持したまま待機します。
検索系SQL実行 = ドキュメントMapper
※「=」はPSP有効のデータフロー
▼コンポーネントプールについて
コンポーネントプールを利用していない場合、コネクションがクローズするタイミングでカーソルが解放されます。
しかし、コンポーネントプールを利用している場合、コネクションがクローズされずにプールに戻されるため、 カーソルが解放されずに蓄積する可能性があります。
■原因
「■仕様説明」に記載したどちらか、もしくは双方の仕様により、カーソルが解放されない状態で繰り返し処理を行った結果、Oracle 側のオープンカーソル数の上限を超えてしまったことが原因と考えられます。
■回避策
1.PSP の入力を消費しない処理の修正
「■仕様説明」に記載したドキュメントMapper 内でスクリプト変数への値の代入のみを行っている場合は、 変数Mapper に変更し、PSPを使用しない処理とすることでご対応ください。
変数Mapper は出力先がなく、変数に値をセットする場合に適した処理を行うため、入力→変数に代入する場合はドキュメントMapper よりも変数Mapper の方がパフォーマンスに優れます。
2.コンポーネントプールの使用しないに設定する
コンポーネントプールを使用する設定にしている場合は、コンポーネントプールの使用しないに設定することでご対応ください。
3.オープンカーソル数の上限を拡張
Oracle 側のオープンカーソル数の上限を拡張し、[検索系SQL実行] 処理を実行する回数分、オープンカーソル数を確保することでご対応ください。