问题描述
在我们的其中一种产品中,我们使用ODP.net托管驱动程序通过存储过程从Oracle数据库中检索数据.
In one of our products we retrieve data from the Oracle database using stored procedures using the ODP.net managed driver.
每隔一段时间(大约每1000个查询),我们都会收到以下异常:
Every now and then (roughly every 1000 queries) we get the following exception:
(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 的大小参数无效(
It seems like ODP.net is calling System.Net.Sockets.Socket.Receive with an invalid size parameter (<=0 or greater than the length of buffer minus the value of the offset parameter).
该异常不能手动重现,并且在执行具有不同参数(即,它是随机的)的不同过程时也不会引发该异常.
The exception cannot be reproduced manually and is never raised while executing different procedures with different parameters (ie it's random).
配置:ODP.net托管驱动程序版本:4.121.1.0.net Framework 4.5Oracle服务器版本:Oracle数据库11g企业版11.2.0.4.0版(Linux)
Configuration:ODP.net managed driver version: 4.121.1.0.net framework 4.5Oracle server version: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 (Linux)
有人有没有遇到过这个问题?是否有可用的修复程序?
Has anyone already experienced this issue? Are there any fixes available?
提前谢谢!
推荐答案
在获得Oracle支持后,他们发送了一个非正式的托管ODP.net库更新版本,似乎可以解决该问题.
After opening a ticket with the Oracle support, they sent an unofficial updated version of the managed ODP.net library which seems to fix the issue.
希望该修复程序应该成为下一个ODAC版本的一部分(今天最新发布的日期是2015年10月).
Hopefully the fix should be part of the next ODAC release (the latest available today is from Oct 2015).
如果您在应用程序中看到此错误,则可能是由于ODP.net托管库中存在相同的错误,而不是您使用它的方式.
If you see this error in your application, it's probably due to the same bug in the managed ODP.net library, not the way you use it.
要考虑的另一件事是,如.
Another thing to consider is if something in the network infrastructure could interrupt idle tcp/ip connections during the execution of long requests as described in this SO answer.
这篇关于ODP.net托管驱动程序引发ORA-12570:网络会话:意外的数据包读取错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!