当社の製品の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)
誰かがすでにこの問題を経験していますか?修正はありますか?
前もって感謝します!
Oracleサポートでチケットを開いた後、彼らは問題を修正しているように見える管理されたODP.netライブラリの非公式の更新バージョンを送信しました。
うまくいけば、修正は次のODACリリースの一部になるはずです(最新の入手可能なのは2015年10月からです)。
アプリケーションでこのエラーが表示された場合、それはおそらく、それを使用する方法ではなく、マネージドODP.netライブラリーの同じバグが原因です。
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