web-dev-qa-db-ja.com

ORA-03113:ASP.Netアプリで長時間非アクティブになった後の通信チャネル上のファイルの終わり

ODAC/ODP.Netドライバーのバージョン10.1.0.301を使用して、単一のOracle 10gサーバーに戻るIIS5上の負荷分散された(セッション状態を使用しない)ASP.Net 2.0アプリがあります。長期間(数時間)非アクティブになった後、アプリケーションは一見ランダムに見えるが、Oracle例外をスローします。

例外:ORA-03113:Oracle.DataAccess.ClientのOracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode、OracleConnection conn、IntPtr opsErrCtx、OpoSqlValCtx * pOpoSqlValCtx、Object src、String procedure)の通信チャネルのファイルの終わりOracle.DataAccess.Client.OracleCommand.System.Data.IDbCommand.ExecuteReader()でのOracleCommand.ExecuteReader(ブール再クエリ、ブールfillRequest、CommandBehaviorの動作)

...スタックのOracle部分はここで終わります...

リクエストごとに新しい接続を作成し、オープンとクローズをtry/catch/finallyでラップして、適切な接続を確実に閉じます。また、すべてをusing(OracleConnection yadayada){...}ブロックでラップします。この問題は、非アクティブのためにスピンダウンされた後のASP.Netアプリケーションの再起動にリンクしているようには見えません。

まだ問題を再現していません。考え、祈り、助けて?


その他: ITに確認すると、ファイアウォールはこれらのサーバー間の接続を強制終了するように設定されていません。

23
Greg Hurlman

ORA-03113:通信チャネルのファイルの終わり

データベースは、ネットワーク接続がこれ以上ないことを知らせますか。これは次の理由による可能性があります。

  1. ネットワークの問題-接続障害、またはファイアウォールの問題
  2. ユーザーにサービスを提供しているデータベースのサーバープロセスが予期せず終了しました。

1)(firewall)の場合、tahiti.Oracle.comでSQLNET.EXPIRE_TIME。これは、構成可能な間隔でネットワークパケットを定期的に送信するsqlnet.oraパラメータです。つまり、これを設定すると、ファイアウォールは接続がライブであると判断します。

1)(network)ネットワーク管理者に話しかけます(接続が信頼できない場合があります)

2)の場合alert.logエラーの場合。サーバープロセスが失敗した場合、エラーメッセージが表示されます。また、問題を特定するためのサポートを有効にするために、トレースファイルが書き込まれます。エラーメッセージはトレースファイルを参照します。

サポートの問題は、metalink.Oracle.comで適切なカスタマーサービス識別子(CSI)を使用して提起できます。

19
mathewbutler

Validate Connection = trueを接続文字列に追加します。

詳細については このブログ をご覧ください。

DETAILS:OracleConnection.Close()の後、実際のデータベース接続は終了しません。接続オブジェクトは接続プールに戻されます。接続プールの使用は、ODP.NETによって暗黙的に行われます。新しい接続を作成すると、プールの1つを取得します。この接続が「まだ開いている」場合、OracleConnection.Open()メソッドは実際には新しい接続を作成しません。実際の接続が(何らかの理由で)切断された場合、最初の選択、更新、挿入、または削除でエラーが発生します。

接続の検証では、Open()メソッドで実際の接続が検証されます。

8
Christian13467

一定時間後に接続を終了するファイアウォールがないことを確認します(これは、同様の問題の原因でした)

5
hamishmcn

通信チャネルのファイルの終わり:

このエラーの経過の1つは、データベースがオープンの段階にあるときにログの書き込みに失敗することです。

データベースがARCHIVELOGまたはNOARCHIVELOGで実行されているかどうかを確認するソリューション

使用を確認するには

select log_mode from v$database;

ARCHIVELOGNOARCHIVELOGに変更しようとした場合

sqlplusを使用して

  • 起動マウント
  • データベースnoarchivelogを変更します。
  • データベースを開いて変更します。

これでうまくいくなら

その後、フラッシュリカバリ領域がいっぱいになる可能性があるため、フラッシュリカバリ領域を調整できます->フラッシュリカバリ領域にスペースがあることを確認した後、データベースをARCHIVELOGに変更できます

4
Mathias Stanley

このエラーメッセージは、実際の問題がOracleデータベースサーバーのスペース不足である場合に、アプリケーションログにスローされる可能性があります。

スペースの問題を修正した後、この特定のエラーメッセージは消えました。

3
Rajesh

このレジストリハックを試すことができます。

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"DeadGWDetectDefault"=dword:00000001
"KeepAliveTime"=dword:00120000

動作する場合は、KeepAliveTimeを増やし続けるだけです。現在2分間に設定されています。

2
Ken Wren

前述の記事は良いです。 http://forums.Oracle.com/forums/thread.jspa?threadID=19175 (限り)

これが頻繁に実行されるものではない場合(ホームページで実行しないでください)、接続プーリングをオフにすることができます。

記事に記載されていないもう1つの「落とし穴」があります。接続で最初にやることがストアドプロシージャの呼び出しである場合、ODPはハングします!!!!管理するためにエラー状態を取り戻すのではなく、完全にハングするだけです!これを修正する唯一の方法は、接続プーリングをオフにすることです。それを行うと、すべての問題がなくなりました。

プーリングは状況によっては優れていますが、すべての接続の最初のステートメントの周りの複雑さが増します。

エラー処理アプローチが非常に優れている場合、ODPがそれを処理するためのオプションにしないのはなぜですか????

0
Brad Bruce