これがシナリオです...
最新バージョンの ODAC (Oracle クライアント) を実行している内部 Web サイトがあります。データベース接続を開き、ストアド プロシージャまたはパッケージ化されたメソッドを実行してから、切断します。接続プーリングがオンになっており、現在、開発環境とテスト環境の両方でバージョン 11g を使用していますが、運用環境では 10gR2 を使用しています。これは本番環境で発生します。
数日前、あるプロセスで ORA-2020 エラーが発生し始めました。このプロセスは、当社の内部 Web サイトの Web ページから呼び出されます。ユーザーが日付を設定し、ボタンを押すだけで、Web サイトとは別の別のシステムでジョブが開始されます。ただし、呼び出し自体はデータベース リンクを使用して関数を実行します。
SQL を精査したところ、その 1 つのデータベース リンクのみが使用されていることがわかりました。これらのリンクはセッション単位であり、ユーザーはデフォルトの制限である 4 を超えていないため、ORA-2020 エラーが発生する可能性はあります。
デフォルトの制限である 4 を超えるように、多くのテストを実行しました。ODAC は、私が思い出す限り、接続ごとにコミットを実行します。4 つの DB リンクを実行してから、SQL を実行することはできないようです。エラーが発生した直後に 1 つの DB リンクがあります。このエラーを発生させる唯一の方法は、4 つの DB リンクを使用してクエリを実行し、次にデータベース リンクを含む関数または動的 SQL を実行することです。この問題は散発的であるため、その問題はありません。それは常に起こっているわけではありません。
質問
- 接続プールにより、最初のプロセスの実行後にユーザー B がユーザー A の接続を使用できるようになり、ユーザー B がより多くのデータベース リンクを使用して SQL ステートメントを実行すると、開いているリンクの数が増える可能性はありますか?
- これは、制限を 4 を超えて引き上げる必要があるシナリオですか? 数を増やすデメリットは?
- データベースから切断する前に、開いているデータベース リンクを明示的に閉じる必要がありますか? Oracleのドキュメントでは、自動的に発生するはずだと示唆しているようですが、「場合によっては」...そうではありません。