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に確認すると、ファイアウォールはこれらのサーバー間の接続を強制終了するように設定されていません。
ORA-03113:通信チャネルのファイルの終わり
データベースは、ネットワーク接続がこれ以上ないことを知らせますか。これは次の理由による可能性があります。
1)(firewall)の場合、tahiti.Oracle.comでSQLNET.EXPIRE_TIME
。これは、構成可能な間隔でネットワークパケットを定期的に送信するsqlnet.oraパラメータです。つまり、これを設定すると、ファイアウォールは接続がライブであると判断します。
1)(network)ネットワーク管理者に話しかけます(接続が信頼できない場合があります)
2)の場合alert.log
エラーの場合。サーバープロセスが失敗した場合、エラーメッセージが表示されます。また、問題を特定するためのサポートを有効にするために、トレースファイルが書き込まれます。エラーメッセージはトレースファイルを参照します。
サポートの問題は、metalink.Oracle.comで適切なカスタマーサービス識別子(CSI)を使用して提起できます。
Validate Connection = trueを接続文字列に追加します。
詳細については このブログ をご覧ください。
DETAILS:OracleConnection.Close()の後、実際のデータベース接続は終了しません。接続オブジェクトは接続プールに戻されます。接続プールの使用は、ODP.NETによって暗黙的に行われます。新しい接続を作成すると、プールの1つを取得します。この接続が「まだ開いている」場合、OracleConnection.Open()メソッドは実際には新しい接続を作成しません。実際の接続が(何らかの理由で)切断された場合、最初の選択、更新、挿入、または削除でエラーが発生します。
接続の検証では、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=19175 (限り)
これが頻繁に実行されるものではない場合(ホームページで実行しないでください)、接続プーリングをオフにすることができます。
記事に記載されていないもう1つの「落とし穴」があります。接続で最初にやることがストアドプロシージャの呼び出しである場合、ODPはハングします!!!!管理するためにエラー状態を取り戻すのではなく、完全にハングするだけです!これを修正する唯一の方法は、接続プーリングをオフにすることです。それを行うと、すべての問題がなくなりました。
プーリングは状況によっては優れていますが、すべての接続の最初のステートメントの周りの複雑さが増します。
エラー処理アプローチが非常に優れている場合、ODPがそれを処理するためのオプションにしないのはなぜですか????