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

例外: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 recrety,boolean fillrequest,CommandBehavior行为)at oracle.dataaccess.client.oraclecommand.system.data.idbcommand.executereader()

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

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

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


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

有帮助吗?

解决方案

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

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

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

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

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

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

支持问题可以在以下位置提出: Metalink.oracle.com 具有合适的客户服务标识符 (CSI)

其他提示

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

看着 这个博客 查找更多信息。

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

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

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

通信通道上的文件结尾:

出现此错误的原因之一是数据库在打开阶段无法写入日志;

解决方案检查数据库是否以 ARCHIVELOG 或 NOARCHIVELOG 模式运行

检查使用情况

select log_mode from v$database;

如果它打开 ARCHIVELOG 尝试改变成 NOARCHIVELOG

通过使用sqlplus

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

如果它适用于这个

然后,您可以调整FlashRecovery区域,可能是您的FlashRecovery区域已满 - >然后确认您的FlashRecovery区域具有可以将数据库更改为 ARCHIVELOG

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

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

你可以尝试这个注册表破解:

[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 为我们处理它?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top