【问题标题】:ORA-03113: end-of-file on communication channel after long inactivity in ASP.Net appORA-03113: 在 ASP.Net 应用程序中长时间不活动后,通信通道上的文件结束
【发布时间】:2021-12-18 00:19:34
【问题描述】:

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

异常:ORA-03113:通信通道上的文件结尾 Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode、OracleConnection conn、IntPtr opsErrCtx、OpoSqlValCtx* pOpoSqlValCtx,对象 src,字符串过程)在 Oracle.DataAccess.Client.OracleCommand.ExecuteReader(布尔重新查询, Boolean fillRequest,CommandBehavior 行为)在 Oracle.DataAccess.Client.OracleCommand.System.Data.IDbCommand.ExecuteReader()

...堆栈的 Oracle 部分到此结束...

我们正在为每个请求创建新连接,将打开和关闭包装在 try/catch/finally 中以确保正确关闭连接,并将整个事情包装在 using (OracleConnection yadayada) {...} 块中.此问题似乎与 ASP.Net 应用程序在因不活动而停止后重新启动有关。

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


更多:经 IT 部门核实,防火墙未设置为终止这些服务器之间的连接。

【问题讨论】:

标签: oracle oracle10g odp.net oracleexception


【解决方案1】:

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

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

  1. 网络问题 - 连接错误或防火墙问题
  2. 为您提供服务的数据库上的服务器进程意外死亡。

对于 1)(防火墙)在 tahiti.oracle.com 搜索 SQLNET.EXPIRE_TIME。这是一个 sqlnet.ora 参数,它将以可配置的时间间隔定期发送网络数据包,即:设置这将使防火墙相信连接是活动的。

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

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

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

【讨论】:

  • alert.log 在哪里以及何时生成?
  • 警报日志是数据库端日志。与您的 DBA 交谈,让他们在您收到错误时查找时间戳。您应该始终查看该日志中是否存在任何 ORA-3113 或类似的会话丢失错误。
【解决方案2】:

Validate Connection=true 添加到您的连接字符串中。

查看this blog 了解更多信息。

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

使用验证连接,真正的连接在 Open() 方法中进行验证。

【讨论】:

  • 但是请注意,根据docsThis attribute should be used only when absolutely necessary, because it causes a round-trip to the database to validate each connection immediately before it is provided to the application.,设置标志会导致性能损失
  • 对于舒尔,您绝对正确!验证连接会执行一次额外的数据库往返,以确保连接仍然连接。
【解决方案3】:

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

【讨论】:

  • 看起来您遇到的问题与我们的问题不同(尽管在我们的案例中 IT 也向我们保证不是防火墙,但最终有人意识到必须在更改发生之前重新启动防火墙地点)
  • 我在 DoD Oracle 安装中遇到了这个问题。网络管理员喜欢设置防火墙规则以在几分钟后快速关闭连接。然后池连接将在下一次操作时终止。
【解决方案4】:

通信通道上的文件结束:

这个错误的一个过程是由于数据库在打开阶段没有写入日志;

解决方法检查数据库是否运行在 ARCHIVELOG 或 NOARCHIVELOG 中

检查使用

select log_mode from v$database;

如果它在ARCHIVELOG 尝试更改为NOARCHIVELOG

通过使用 sqlplus

  • 启动挂载
  • alter database noarchivelog;
  • 更改数据库打开;

如果它适用于这个

然后您可以调整您的闪存恢复区域,可能您的闪存恢复区域已满 -> 然后确认您的闪存恢复区域有空间后,您可以将数据库更改为ARCHIVELOG

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        【解决方案7】:

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

        如果这不是经常运行的东西(不要在您的主页上这样做),您可以关闭连接池。

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

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

        如果错误处理方法这么好,为什么不让 ODP 为我们处理它??

        【讨论】:

          【解决方案8】:

          //首先以mount方式启动数据库 启动挂载

          //禁用归档日志 更改数据库 noarchivelog //然后把db打开 更改数据库打开

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-01
          • 2012-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-19
          相关资源
          最近更新 更多