24

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

异常:ORA-03113:Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode,OracleConnection conn,IntPtr opsErrCtx,OpoSqlValCtx* pOpoSqlValCtx* pOpoSqlValCtx,Object src,String 过程)在 Oracle.DataAccess.Client 的通信通道上的文件结尾Oracle.DataAccess.Client.OracleCommand.System.Data.IDbCommand.ExecuteReader() 处的 .OracleCommand.ExecuteReader(布尔重新查询,布尔填充请求,CommandBehavior 行为)

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

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

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


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

4

8 回答 8

19

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

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

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

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

对于 1) ( network ) 与您的网络管理员交谈(连接可能不可靠)

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

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

于 2008-09-18T11:56:28.847 回答
10

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

查看此博客以了解更多信息。

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

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

于 2009-08-08T21:44:51.240 回答
5

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

于 2008-09-17T14:00:20.350 回答
4

通信通道上的文件结尾:

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

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

检查使用

select log_mode from v$database;

如果它在ARCHIVELOG尝试变成NOARCHIVELOG

通过使用 sqlplus

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

如果它适用于此

然后你可以调整你的 flashrecovery 区域,它可能是你的 flashrecovery 区域已满 -> 然后在确认你的 flashrecovery 区域有空间之后,你可以将你的数据库更改为ARCHIVELOG

于 2013-03-12T14:45:31.850 回答
3

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

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

于 2014-03-24T21:38:41.043 回答
2

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

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

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

于 2008-09-18T15:51:11.857 回答
0

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

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

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

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

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

于 2008-10-09T12:13:58.500 回答
0

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

//禁用archivelog alter database noarchivelog //然后把db放到open alter database open

于 2021-12-17T16:19:34.400 回答