ORA-03113:ASP.Net应用程序长时间不活动后,通信通道上的文件结束

时间:2008-09-17 13:18:42

标签: oracle oracle10g odp.net oracleexception

我使用版本10.1.0.301的ODAC / ODP.Net驱动程序在IIS5上运行负载平衡(不使用会话状态)ASP.Net 2.0应用程序,运行回单个Oracle 10g服务器。在长时间不活动(几个小时)之后,应用程序看似随机,将抛出Oracle异常:

  

异常:ORA-03113:通信通道上的文件结束位置   Oracle.DataAccess.Client.OracleException.HandleErrorHelper(的Int32   errCode,OracleConnection conn,IntPtr opsErrCtx,OpoSqlValCtx *   pOpoSqlValCtx,Object src,String procedure)at   Oracle.DataAccess.Client.OracleCommand.ExecuteReader(布尔重新查询,   布尔fillRequest,CommandBehavior行为)at   Oracle.DataAccess.Client.OracleCommand.System.Data.IDbCommand.ExecuteReader()

     

...堆栈的Oracle部分在这里结束......

我们正在为每个请求创建新的连接,具有开放性和安全性。 close包装在try / catch / finally中以确保正确的连接关闭,整个事务包含在using(OracleConnection yadayada){...}块中。此问题似乎与在停用不活动后重新启动ASP.Net应用程序有关。

我们还没有自己重现这个问题。思想,祈祷,帮助?


更多:经过IT检查,防火墙未设置为终止这些服务器之间的连接。

7 个答案:

答案 0 :(得分:19)

  

ORA-03113:通信频道上的文件结尾

数据库是否让您知道网络连接不再存在。这可能是因为:

  1. 网络问题 - 连接错误或防火墙问题
  2. 服务于您的数据库上的服务器进程意外死亡。
  3. 1)(防火墙)搜索SQLNET.EXPIRE_TIME的tahiti.oracle.com。这是一个sqlnet.ora参数,它将定期以可配置的间隔发送网络数据包,即:设置这将使防火墙认为连接是有效的。

    1)(网络)与您的网络管理员联系(连接可能不可靠)

    For 2)检查alert.log是否有错误。如果服务器进程失败,则会出现错误消息。此外,还将编写跟踪文件以支持识别问题。错误消息将引用跟踪文件。

    可以使用合适的客户服务标识符(CSI)在 metalink.oracle.com 处提出支持问题

答案 1 :(得分:8)

验证Connection = true 添加到您的连接字符串。

请查看this blog以了解详情。

<强>详情: 在OracleConnection.Close()之后,真正的数据库连接不会终止。连接对象放回连接池中。 ODP.NET隐含了连接池的使用。如果您创建新连接,则会获得其中一个池。如果此连接“尚未打开”,则OracleConnection.Open()方法不会真正创建新连接。如果真正的连接中断(由于任何原因),您在第一次选择,更新,插入或删除时会失败。

使用Validate Connection,可以在Open()方法中验证实际连接。

答案 2 :(得分:5)

检查在一段时间后没有防火墙结束连接(这是我们遇到类似问题的原因)

答案 3 :(得分:4)

  

通讯渠道上的文件结尾:

此错误的一个过程是由于数据库在打开阶段时无法写入日志;

解决方案检查数据库是否在ARCHIVELOG或NOARCHIVELOG

中运行

检查使用

select log_mode from v$database;

如果其ARCHIVELOG尝试更改为NOARCHIVELOG

使用sqlplus

  • startup mount
  • alter database noarchivelog;
  • alter database open;

如果适用于此

然后您可以调整您的闪回恢复区域,可能是您的闪回恢复区已满 - &GT;然后在确认您的flashrecovery区域有空间后,您可以将数据库更改为ARCHIVELOG

答案 4 :(得分:3)

当实际问题是oracle数据库服务器空间不足时,可能会在应用程序日志中抛出此错误消息。

纠正空间问题后,此特定错误消息消失。

答案 5 :(得分:1)

你可以试试这个注册表黑客:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"DeadGWDetectDefault"=dword:00000001
"KeepAliveTime"=dword:00120000

如果有效,请继续增加KeepAliveTime。它目前设置为2分钟。

答案 6 :(得分:0)

前面提到的文章很好。 http://forums.oracle.com/forums/thread.jspa?threadID=191750(就目前而言)

如果这不是经常运行的(不在主页上执行),则可以关闭连接池。

文章中没有提到另外一个“问题”。如果您尝试连接的第一件事是调用存储过程,ODP将会挂起!你不会得到一个错误的条件来管理,只是一个完整的HANG!解决此问题的唯一方法是关闭连接池。一旦我们这样做,所有问题就消失了。

在某些情况下,池化很好,但代价是每个连接的第一个语句都会增加复杂性。

如果错误处理方法如此优秀,为什么它们不能让ODP为我们处理它?<​​/ p>