9

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

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

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

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

4

4 に答える 4

9

接続を使用しようとすると、どのようなエラーが表示されますか?

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

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

受け取った実際の Oracle エラー メッセージは、これらの代替手段のどれが問題を引き起こしているかを示します。

于 2009-12-28T01:26:24.027 に答える
4

イルファン、

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

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

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


profile='PROFILE1' およびresource_name ='IDLE_TIME'である dba_profiles から profile、resource_name、limit を選択します

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

ありがとう、

ラジェッシュ

于 2009-12-27T18:55:43.703 に答える
2

実際の理由は、@Justin Caveが彼の回答で述べたconnection closed exceptionものと同じです。

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

受け取った実際の Oracle エラー メッセージは、これらの代替手段のどれが問題を引き起こしているかを示します。

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

select * from user_resource_limits user_resource where user_resource.resource_name in ('IDLE_TIME','CONNECT_TIME');
于 2016-12-20T09:09:44.427 に答える
1

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

于 2009-12-27T16:36:08.927 に答える