Stored procedures ODP.net托管驱动程序抛出ORA-12570:网络会话:意外的数据包读取错误

Stored procedures ODP.net托管驱动程序抛出ORA-12570:网络会话:意外的数据包读取错误,stored-procedures,oracle11g,odp.net-managed,Stored Procedures,Oracle11g,Odp.net Managed,在我们的一款产品中,我们使用ODP.net托管驱动程序,使用存储过程从Oracle数据库检索数据 偶尔(大约每1000次查询)我们会遇到以下例外情况: (ORA-12570: Network Session: Unexpected packet read error) ---> Oracle.ManagedDataAccess.Client.OracleException: ORA-12570: Network Session: Unexpected packet read error -

在我们的一款产品中,我们使用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正在使用无效的大小参数调用(在使用Oracle支持打开票据后,他们发送了托管ODP.net库的非官方更新版本,该版本似乎解决了问题

希望该修复程序将成为下一个ODAC版本的一部分(最新版本将于2015年10月发布)

如果您在应用程序中看到此错误,可能是由于托管ODP.net库中的相同错误,而不是您使用它的方式


另一个要考虑的是,网络基础结构中的某些东西在执行长请求时会中断空闲TCP/IP连接,如

< P>。在阅读类似的问题后,看起来这实际上是一个汇集问题。显然,答案是在CONE中设置<代码>池>假< /代码>。或找出可以打开多少线程以及连接可以打开多长时间,以避免Oracle无法处理。这是该问题作者发布的答案:

为了找到启用池的最佳配置,我创建了一个测试应用程序来启动50个线程(每个线程每50毫秒进行一次测试),并降低了默认池值,直到错误停止。这样我就能够获得一个最佳配置,稳定,没有任何错误

显然,它并不适用于每台服务器,但这是我的最终连接字符串配置:

Pooling=true;最小池大小=1;连接生存期=180;最大池大小=50;增量池大小=5


有没有解决这个问题的方法@vc J u这不是你的情况,但是当连接到需要高级加密的服务器时,尝试使用Oracle纯托管驱动程序时,会发生相同的错误()嗨,你成功地解决了这个问题吗?Thanks@EdgarRochaCarvalho是的,但是花了一段时间…(见下面的答案)@Pierlucs请参阅下面的答案,我希望他们修复了另外两个bug,池管理和clob bytearray错误。()。我将在下一个正式版本中重试。@Edgarochacarvalho令人恼火的是,他们似乎对论坛上发布的消息没有太多关注,如果你没有支持帐户,你唯一能做的就是等待nuget的updateOracle.ManagedDataAccess:12.1.24160419-同样的问题。12c ODP.NET c也有同样的问题客户机,产品版本4.121.2.20150926 ODAC RELEASE 4。经过4个月的调试,这是我第一次随机遇到这种情况。它转到我的
catch
,然后继续下一个函数调用。我备份了调试游标,重新运行出现异常的DB更新函数,然后它就正常运行了没有错误。也许解决方案是让一个例程检查错误,如果发现错误,重新运行数据库更新功能?我仍然在Oracle.ManagedDataAccess版本19.6.0中看到这个问题。这个解决方案或禁用池并不能解决问题。似乎问题是由Vc 74解释的