连接关闭,应用程序挂起 ODP.Net 4.122.19.1 (19) 和 Oracle 数据库 11.2.0.4 SQLNET.EXPIRE_TIME 设置
Connections gets closed and application hang with ODP.Net 4.122.19.1 (19) and Oracle database 11.2.0.4 with SQLNET.EXPIRE_TIME set
注意:抱歉,这不是真正的问题,而是可能对遇到相同问题的人有用的信息。
我们的应用程序遇到了一个大问题,因为 Oracle 支持人员似乎没有提到一个错误。
我不会打开案例,因为现在问题已知,我们会解决它,但花了很长时间才明白这一点,我在这里分享信息,可能会节省一些人的时间。
4.122.19.1 ODP.Net 不响应 DCD 数据包,几分钟后服务器将连接视为 DEAD。
应用程序挂起等待池中的新连接。
这发生在连接到 11.2.0.4 Oracle 服务器并且 SQLNET.EXPIRE_TIME 已设置。
应用程序永远不会停止,W3WP.exe 应该被终止
https://www.oracle.com/technetwork/database/enterprise-edition/oraclenetdcd-2179641.pdf
调试分析可能会显示以下结果。
DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr ByRef, IntPtr ByRef, Oracle.DataAccess.Client.OpoConValCtx* ByRef, Oracle.DataAccess.Client.OpoConRefCtx)+14c
[[InlinedCallFrame] (Oracle.DataAccess.Client.OpsCon.Dispose)] Oracle.DataAccess.Client.OpsCon.Dispose(IntPtrByRef, IntPtrByRef, Oracle.DataAccess.Client.OpoConValCtx*ByRef, Oracle.DataAccess.Client.OpoConRefCtx)
Oracle.DataAccess.Client.ConnectionPool.RegulateNumOfCons(System.Object)+9e7
Oracle.DataAccess.Client.ConnectionPool.RegulateNumOfCons(System.Object)+3c3
Oracle.DataAccess.Client.CPCtx.RegulateNumOfConsThreadFunc(System.Object)+135
mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+163
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+14
mscorlib_ni!System.Threading.TimerQueueTimer.CallCallback()+ba
mscorlib_ni!System.Threading.TimerQueueTimer.Fire()+87
mscorlib_ni!System.Threading.TimerQueue.FireNextTimers()+75
非常感谢 Patrick Beynio 的理解,我现在 post 这个解决方案作为答案。
解决方案:通过删除服务器上 SQLNET.ORA 中的 SQLNET.EXPIRE_TIME 来禁用 DCD,或者升级到没有更多 DCD 数据包但使用 TCP 堆栈的 post 12.2 数据库版本.
注意:抱歉,这不是真正的问题,而是可能对遇到相同问题的人有用的信息。
我们的应用程序遇到了一个大问题,因为 Oracle 支持人员似乎没有提到一个错误。
我不会打开案例,因为现在问题已知,我们会解决它,但花了很长时间才明白这一点,我在这里分享信息,可能会节省一些人的时间。
4.122.19.1 ODP.Net 不响应 DCD 数据包,几分钟后服务器将连接视为 DEAD。 应用程序挂起等待池中的新连接。
这发生在连接到 11.2.0.4 Oracle 服务器并且 SQLNET.EXPIRE_TIME 已设置。
应用程序永远不会停止,W3WP.exe 应该被终止
https://www.oracle.com/technetwork/database/enterprise-edition/oraclenetdcd-2179641.pdf
调试分析可能会显示以下结果。
DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr ByRef, IntPtr ByRef, Oracle.DataAccess.Client.OpoConValCtx* ByRef, Oracle.DataAccess.Client.OpoConRefCtx)+14c
[[InlinedCallFrame] (Oracle.DataAccess.Client.OpsCon.Dispose)] Oracle.DataAccess.Client.OpsCon.Dispose(IntPtrByRef, IntPtrByRef, Oracle.DataAccess.Client.OpoConValCtx*ByRef, Oracle.DataAccess.Client.OpoConRefCtx)
Oracle.DataAccess.Client.ConnectionPool.RegulateNumOfCons(System.Object)+9e7
Oracle.DataAccess.Client.ConnectionPool.RegulateNumOfCons(System.Object)+3c3
Oracle.DataAccess.Client.CPCtx.RegulateNumOfConsThreadFunc(System.Object)+135
mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+163
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+14
mscorlib_ni!System.Threading.TimerQueueTimer.CallCallback()+ba
mscorlib_ni!System.Threading.TimerQueueTimer.Fire()+87
mscorlib_ni!System.Threading.TimerQueue.FireNextTimers()+75
非常感谢 Patrick Beynio 的理解,我现在 post 这个解决方案作为答案。
解决方案:通过删除服务器上 SQLNET.ORA 中的 SQLNET.EXPIRE_TIME 来禁用 DCD,或者升级到没有更多 DCD 数据包但使用 TCP 堆栈的 post 12.2 数据库版本.