web-dev-qa-db-ja.com

OracleのIDLEタイムアウトパラメータ

プロセスの1つが、データベースにアクセスせずに3時間のコンピューティングを行っている状況で立ち往生しています。プロセスを呼び出す前に取得された接続は Oracle サーバーによって閉じられ、後続のクエリまたはコミットは接続閉じ例外をスローします。

この問題は、何らかの理由で長時間アイドル状態になっている接続をOracleが閉じることに関連しているように見えます。

Sqlnet.oraでEXPIRE_TIMEOUTを変更しようとしましたが、それも役に立ちませんでした。

この問題を解決するために何ができるでしょうか。

8
Irfan Zulfiqar

接続を使用しようとすると、どのようなエラーが発生しますか?

Oracleは、デフォルトでは、非アクティブのために接続を閉じません。 IDLE_TIMEを使用してプロファイルを構成し、Oracleに非アクティブな接続を閉じさせることができますが、それを行ったようには聞こえません。また、クライアントが応答しない場合に接続の切断を検出して接続を閉じるようにOracleを構成することもできます。クライアントが3時間埋没している場合、タイムリーに応答しない可能性があります。しかし、それは広告が追加の構成手順を必要とする可能性が低いようです。

私の経験では、ネットワークが接続を切断している可能性が高い状況です。たとえば、ファイアウォールを介して接続している場合、ファイアウォールは、アイドル状態が長すぎる接続を頻繁に閉じます。

表示される実際のOracleエラーメッセージは、これらの選択肢のどれが問題を引き起こしているのかを示します。

8
Justin Cave

イルファン、

  1. 変更を有効にするには、init.oraファイルにresource_limit = TRUEがあることを確認してください。

  2. また、制限を設定しようとしているユーザーがデフォルトのプロファイルに割り当てられているかどうかを確認してください。

select profile from dba_users where username = 'TEST_USER';
  PROFILE1

プロファイル、resource_name、limitをdba_profilesから選択します。ここでprofile = 'PROFILE1'および
resource_name = 'IDLE_TIME'

3ユーザーがカスタムプロファイルに割り当てられている場合は、カスタムプロファイルのパラメータが適切に設定されていることを確認してください。また、connect_timeパラメーターも確認する必要があります(デフォルトまたはカスタムプロファイルのいずれか該当する方。接続時間が超過すると、接続は終了します。)

最後に、パラメータが設定される前に現在のセッションが開始された場合、それは有効にならないことに注意してください。変更は、変更を加えた後の次のセッションからのみ開始されます。

便利なリンク。

http://www.adp-gmbh.ch/blog/2005/april/17.html
http://asktom.Oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:453256655431

ありがとう、

ラジェッシュ

4

connection closed exceptionの実際の理由は、彼の回答で言及されている@ Justin Caveと同じようです。

私の経験では、ネットワークが接続を切断している可能性が高い状況です。たとえば、ファイアウォールを介して接続している場合、ファイアウォールは、アイドル状態が長すぎる接続を頻繁に閉じます。

表示される実際のOracleエラーメッセージは、これらの選択肢のどれが問題を引き起こしているのかを示します。

それでも誰かがプロファイル用に構成されたIDLE_TIMECONNECT_TIMEを知りたい場合は、以下のクエリを実行できます。

select * from user_resource_limits user_resource where user_resource.resource_name in ('IDLE_TIME','CONNECT_TIME');
1
Arpit Aggarwal

使用しているデータベースに関係なく、使用するときに接続が有効になると想定するのはお勧めできません。これを処理する1つの方法は、問題のデータベースへのアクティブな接続を返す関数を作成し、特定のデータベースのハンドル/オブジェクト/その他が必要になるたびにそれを呼び出すことです。このルーチンは、データベースとそれに関連する接続オブジェクトのリストを維持します。関数が正常に呼び出されたときに接続オブジェクトがライブであり、関数がハンドル/オブジェクト/何でも開いたままにするようにデータベースを説得するために何かを実行した後にオブジェクトが返される場合。ライブ接続オブジェクトがない場合、ルーチンは新しいオブジェクトを開き、それを返します。 1分ほどで期限切れになるタイマーにキャンプアウトする2番目のルーチンがあると便利です。タイマーが期限切れになり、2番目のルーチンが呼び出されると、データベース接続のリストを調べて、設定された時間(データベースのセッションタイムアウト値よりも大幅に少ない)アクティビティがない接続を探します。あまりにも長い間非アクティブであったものは閉じられ、クリーンアップされます。