ORA-03113:ASP.Net应用中长时间不活动后,通信通道上的文件结束
我已经使用ODAC / ODP.Net驱动程序的10.1.0.301版在IIS5上实现了负载平衡(不使用会话状态)ASP.Net 2.0应用程序,该应用程序运行回单个Oracle 10g服务器。长时间不活动(几个小时)后,看似随机的应用程序将引发Oracle异常:
Exception: ORA-03113: end-of-file on communication channel at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure) at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior) at Oracle.DataAccess.Client.OracleCommand.System.Data.IDbCommand.ExecuteReader() ...Oracle portion of the stack ends here...
我们将在每个请求上创建新连接,将打开和关闭包装在try / catch / finally中,以确保正确关闭连接,整个过程包装在using(OracleConnection yadayada){...}块中。由于不活动而被分解后,此问题似乎没有链接到ASP.Net应用程序的重新启动。
我们还没有自己重现问题。思想,祈祷,帮助?
更多:经过IT检验,防火墙未设置为杀死这些服务器之间的连接。
解决方案
回答
请检查是否在一定时间后没有终止连接的防火墙(这是我们遇到类似问题的原因)
回答
ORA-03113:通信通道上的文件结束
数据库是否在通知我们不再存在网络连接。这可能是因为:
- 网络问题-连接错误或者防火墙问题
- 为我们提供服务的数据库上的服务器进程意外死亡。
对于1)(防火墙),在tahiti.oracle.com中搜索SQLNET.EXPIRE_TIME。这是一个sqlnet.ora参数,它将以可配置的时间间隔定期发送网络数据包,即:设置此参数将使防火墙认为该连接处于活动状态。
对于1)(网络),请与网络管理员联系
对于2),请检查alert.log中是否有错误,如果服务器进程失败,则此处将显示错误消息,并且将写入跟踪文件以使支持人员能够识别问题。该错误信息将引用跟踪文件。
可以在metalink.oracle.com上使用适当的客户服务标识符(CSI)提出支持问题。
回答
我们可以尝试以下注册表黑客:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters] "DeadGWDetectDefault"=dword:00000001 "KeepAliveTime"=dword:00120000
如果可行,只需继续增加KeepAliveTime
。当前设置为2分钟。
回答
前面提到的文章很好。 http://forums.oracle.com/forums/thread.jspa?threadID=191750(目前为止)
如果这不是经常运行的内容(请不要在主页上执行此操作),则可以关闭连接池。
本文中没有提到其他"陷阱"。如果我们尝试使用连接进行的第一件事是调用存储过程,则ODP会挂起!!!我们将不会回去管理任何错误情况,只需全力以赴!解决此问题的唯一方法是关闭连接池。一旦我们做到了,所有的问题就消失了。
池化在某些情况下是好的,但代价是每个连接的第一个语句周围的复杂性都会增加。
如果错误处理方法如此好,为什么他们不让ODP为我们处理它呢?
回答
将Validate Connection = true添加到连接字符串。
查看此博客以了解更多信息。
细节:
在OracleConnection.Close()之后,实际的数据库连接不会终止。连接对象放回连接池中。 ODP.NET隐式使用连接池。如果创建新连接,则将获得其中一个池。如果此连接"尚未打开",则OracleConnection.Open()方法实际上不会创建新的连接。如果实际连接断开(出于任何原因),则在第一次选择,更新,插入或者删除时会失败。
使用Validate Connection,可以在Open()方法中验证真实的连接。