【问题标题】:ODP.net managed driver throws ORA-12570: Network Session: Unexpected packet read errorODP.net 托管驱动程序抛出 ORA-12570: Network Session: Unexpected packet read error
【发布时间】:2015-01-23 04:50:22
【问题描述】:

在我们的一款产品中,我们使用 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。

异常不能手动重现,并且在执行具有不同参数的不同过程时永远不会引发(即它是随机的)。

配置: ODP.net 托管驱动程序版本:4.121.1.0 .net 框架 4.5 Oracle服务器版本:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 (Linux)

有人遇到过这个问题吗?有没有可用的修复程序?

提前致谢!

【问题讨论】:

  • 曾经有任何解决这个@vc_74的方法
  • 这不是你的情况,但是在连接到需要高级加密的服务器时尝试使用Oracle纯托管驱动程序时会发生同样的错误(stackoverflow.com/a/34227815/12597
  • 嗨,您解决了这个问题吗?谢谢
  • @EdgarRochaCarvalho 是的,但花了一段时间......(见下面的答案)
  • @PierlucSS 请看下面的答案

标签: stored-procedures oracle11g odp.net-managed


【解决方案1】:

在向 Oracle 支持开票后,他们发送了托管 ODP.net 库的非官方更新版本,似乎解决了该问题。

希望该修复应该成为下一个 ODAC 版本的一部分(今天可用的最新版本是 2015 年 10 月)。

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

要考虑的另一件事是,在执行长请求期间,网络基础设施中的某些东西是否会中断空闲的 tcp/ip 连接,如 this SO answer 中所述。

【讨论】:

  • 我希望他们修复了另外两个错误,池管理和 clob bytearray 错误。 (stackoverflow.com/questions/35352060/…)。我会在下一次正式发布时再试一次。
  • @EdgarRochaCarvalho 恼人的是他们似乎不太关注他们论坛上发布的消息,如果你没有支持帐户,你唯一能做的就是等待更新
  • 来自 nuget 的 Oracle.ManagedDataAccess:12.1.24160419 - 同样的问题。
  • 与 12c ODP .NET 客户端,产品版本 4.121.2.20150926 ODAC RELEASE 4 相同的问题。经过 4 个月的调试,我第一次随机发生这种情况就好了。它去了我的catch,然后继续下一个函数调用。我备份了我的调试光标以重新运行出现异常的数据库更新功能,然后它顺利通过而没有错误。也许解决方案只是有一个例程来检查错误并在发现错误时重新运行数据库更新功能?
  • 我仍然在 Oracle.ManagedDataAccess 19.6.0 版中看到该问题
【解决方案2】:

在阅读了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

【讨论】:

  • 这个splution或禁用池并不能解决它。似乎问题是 Vc 74 解释的问题
猜你喜欢
  • 2013-07-09
  • 2016-05-22
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
相关资源
最近更新 更多