18

当社の製品の 1 つで、ODP.net マネージ ドライバーを使用したスト​​アド プロシージャを使用して、Oracle データベースからデータを取得します。

ときどき (およそ 1000 クエリごとに) 次の例外が発生します。

(ORA-12570: Network Session: Unexpected packet read error)
---> Oracle.ManagedDataAccess.Client.OracleException: ORA-12570: Network Session: Unexpected packet read error
---> OracleInternal.Network.NetworkException: ORA-12570: Network Session: Unexpected packet read error
---> System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: size
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, SocketError& errorCode)
   at OracleInternal.Network.ReaderStream.ReadIt(OraBuf OB, Int32 len)
   --- End of inner exception stack trace ---
   at OracleInternal.Network.ReaderStream.ReadIt(OraBuf OB, Int32 len)
   at OracleInternal.Network.ReaderStream.WaitForReset()
   at OracleInternal.Network.OracleCommunication.Reset()
   at OracleInternal.TTC.TTCExecuteSql.ReceiveExecuteResponse(Accessor[]& defineAccessors, Accessor[] bindAccessors, Boolean bHasReturningParams, SQLMetaData& sqlMetaData, SqlStatementType statementType, Int64 noOfRowsFetchedLastTime, Int32 noOfRowsToFetch, Int32& noOfRowsFetched, Int64& queryId, Int32 longFetchSize, Int32 initialLOBFetchSize, Int64[] scnFromExecution, Boolean& bAllPureInputBinds, DataUnmarshaller& dataUnmarshaller, MarshalBindParameterValueHelper& marshalBindParamsHelper, Boolean bDefineDone, Boolean& bMoreThanOneRowAffectedByDmlWithRetClause)
   --- End of inner exception stack trace ---
   at Oracle.ManagedDataAccess.Client.OracleException.HandleError(OracleTraceLevel level, OracleTraceTag tag, Exception ex)
   at OracleInternal.TTC.TTCExecuteSql.ReceiveExecuteResponse(Accessor[]& defineAccessors, Accessor[] bindAccessors, Boolean bHasReturningParams, SQLMetaData& sqlMetaData, SqlStatementType statementType, Int64 noOfRowsFetchedLastTime, Int32 noOfRowsToFetch, Int32& noOfRowsFetched, Int64& queryId, Int32 longFetchSize, Int32 initialLOBFetchSize, Int64[] scnFromExecution, Boolean& bAllPureInputBinds, DataUnmarshaller& dataUnmarshaller, MarshalBindParameterValueHelper& marshalBindParamsHelper, Boolean bDefineDone, Boolean& bMoreThanOneRowAffectedByDmlWithRetClause)
   at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteNonQuery(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, Int32 longFetchSize, Int32 lobPrefetchSize, OracleDependencyImpl orclDependencyImpl, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, Boolean isFromEF)
   at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()

ODP.net がSystem.Net.Sockets.Socket.Receiveを無効なサイズ パラメータ (<=0 またはバッファの長さからオフセット パラメータの値を引いた値より大きい) で呼び出しているようです。

例外は手動で再現することはできず、さまざまなパラメーターを使用してさまざまなプロシージャを実行している間は発生しません (つまり、ランダムです)。

構成: ODP.net 管理対象ドライバーのバージョン: 4.121.1.0 .net フレームワーク 4.5 Oracle サーバーのバージョン: Oracle Database 11g Enterprise Edition リリース 11.2.0.4.0 (Linux)

誰かがすでにこの問題を経験していますか? 利用可能な修正はありますか?

前もって感謝します!

4

2 に答える 2

4

Oracle サポートにチケットを開いた後、管理された ODP.net ライブラリの非公式の更新バージョンが送信され、問題が修正されたようです。

うまくいけば、修正は次の ODAC リリースの一部になるはずです (現在利用可能な最新のものは 2015 年 10 月のものです)。

アプリケーションでこのエラーが表示された場合は、使用方法ではなく、マネージド ODP.net ライブラリの同じバグが原因である可能性があります。

考慮すべきもう 1 つのことは、この SO answerで説明されているように、長いリクエストの実行中にネットワーク インフラストラクチャの何かがアイドル状態の tcp/ip 接続を中断する可能性があるかどうかです。

于 2016-03-14T16:10:41.610 に答える
1

ODP.NET Oracle.ManagedDataAcess random ORA-12570 errorsで同様の質問を読んだ後、実際にはプーリングの問題のようです。どうやら答えはPooling=false、接続文字列に設定するか、開くことができるスレッドの数と、Oracleが処理できなくなる前に接続を開くことができる時間を調べることです。これは、投稿されたその質問の作成者の回答です。

プーリングを有効にして最適な構成を見つけるために、50 スレッドを開始するテスト アプリケーションを作成し (各スレッドは 50 ミリ秒ごとに 1 つのテストを実行)、エラーが停止するまでデフォルトのプール値を減らしました。このようにして、エラーなしで安定した最適な構成を取得できました。

明らかに、すべてのサーバーに適用されるわけではありませんが、これが私の最終的な接続文字列構成です。

Pooling=true;Min Pool Size=1;Connection Lifetime=180;Max Pool Size=50;Incr Pool Size=5

于 2016-10-19T19:30:03.860 に答える