我使用版本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检查,防火墙未设置为终止这些服务器之间的连接。
答案 0 :(得分:19)
ORA-03113:通信频道上的文件结尾
数据库是否让您知道网络连接不再存在。这可能是因为:
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
如果适用于此
然后您可以调整您的闪回恢复区域,可能是您的闪回恢复区已满
- &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>