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

StackOverflow https://stackoverflow.com/questions/83068

質問

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

例外:ORA-03113:oracle.dataaccess.client.oracleexception.handleerrorhelper(int32 errcode、oracleconnection conn、intptr opserrctx、oposqlvalctx* poposqlvalctx、object src、string procedure)の通信チャネルのファイルの終了requery、boolean fillequest、commandbehaviorの動作)at oracle.dataaccess.client.oraclecommand.system.data.idbcommand.executereader()

...スタックの Oracle 部分はここで終了します...

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

私たちはまだ問題を自分たちで再現していません。思い、祈り、助けはありますか?


もっと: IT 部門に確認したところ、ファイアウォールはこれらのサーバー間の接続を切断するようには設定されていません。

役に立ちましたか?

解決

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

ネットワーク接続が切断されたことをデータベースが知らせていますか。これは次の理由が考えられます。

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

1) (ファイアウォール) tahiti.oracle.com を検索してください SQLNET.EXPIRE_TIME. 。これは、構成可能な間隔でネットワーク パケットを定期的に送信する sqlnet.ora パラメータです。つまり、次のようになります。これを設定すると、ファイアウォールは接続がライブであると認識します。

1) (通信網) ネットワーク管理者に相談してください (接続が信頼できない可能性があります)

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

サポートの問題は次の場所で提起できます。 metallink.oracle.com 適切な顧客サービス識別子 (CSI) を使用して

他のヒント

追加 接続の検証=true 接続文字列に追加します。

見る このブログ についてさらに詳しく知るには。

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

Validate Connection を使用すると、実際の接続は Open() メソッドで検証されます。

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

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

このエラーの原因の 1 つは、データベースを開く段階でログの書き込みに失敗することです。

解決策 データベースが ARCHIVELOG または NOARCHIVELOG で実行されているかどうかを確認してください。

使用状況を確認する

select log_mode from v$database;

オンの場合 ARCHIVELOG に変えてみてください NOARCHIVELOG

SQLplusを使用して

  • スタートアップマウント
  • データベースのアーカイブログを変更します。
  • データベースを変更して開きます。

これでうまくいくなら

その後、あなたはあなたのフラッシュレッカリーエリアを調整することができます、おそらくあなたのフラッシュレカリーエリアがいっぱいであることを - >あなたのフラッシュレッカリー領域があなたのデータベースを変更できるスペースがあることを確認した後、 ARCHIVELOG

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

スペースの問題を修正した後、この特定のエラー メッセージは表示されなくなりました。

次のレジストリハックを試してみてください。

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

それが機能する場合は、値を増やし続けてください。 KeepAliveTime. 。現在は 2 分に設定されています。

以前紹介した記事は良いですね。 http://forums.oracle.com/forums/thread.jspa?threadID=191750 (それまでのところ)

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

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

状況によってはプーリングが適していますが、その代償として各接続の最初のステートメントに関する複雑さが増します。

エラー処理のアプローチがそれほど優れているのであれば、なぜ ODP がエラーを処理するオプションを設けないのでしょうか????

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top