3

将我的 C# .NET4 应用程序从旧的 32 位 Windows 2003 Server 迁移到新的 64 位 Windows 2008 Server 后,我遇到了一个非常奇怪的错误。我花了整整一周的时间试图找出发生了什么,但我的想法已经用完了,所以请给点建议。

详细信息:
我有一个小型 C# .NET 4.0 应用程序,它从远程 Oracle 数据库服务器中提取一些数据。该应用程序过去在旧的 32 位 Windows 2003 Server 上运行良好。上次我不得不将它移到带有 64 位 Windows 2008 R2 Server 的新服务器上。从那时起,一个返回约 500k 行的 Oracle 数据库查询无法正常工作。启动后大约 2 分钟,它会抛出类似于此的异常:

ORA-03113: 通信通道上的文件结束
进程 ID: 0
会话 ID: 288 序列号: 43544

我已经从 Oracle 站点为 64 位系统下载了最新的 ODAC 驱动程序:64-bit ODAC 11.2 Release 5 (11.2.0.3.20)。我都试过了:安装程序和 XCOPY 版本。通过 .bat 文件安装和配置 ODP.NET4。TNS 设置正确。

远程 Oracle 数据库位于其他国家/地区。我不是它的管理员。它是 Oracle9i EE,64 位,v9.2.0.8.0。

我用于测试的 C# 应用程序如下所示:

using (OracleConnection conn = new OracleConnection("User Id=userId; Password=pass; Data Source=database;"))
{
    conn.Open();
    string sql = "SELECT * FROM table";
    int i = 0;
    using (OracleCommand cmd = new OracleCommand(sql, conn))
    {
        using (OracleDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                if (i++ % 100 == 0)
                {
                    Console.WriteLine(i);
                }
            }
        }

    }
}

我使用过Adapter.Fill(dataTable),但对于测试数据阅读器更好 - 它或多或少地向我展示了某些事情发生的情况。

它使用 ODP.NET 目录中的 Oracle.DataAccess.dll(64 位或 32 位)。应用程序是为任何 CPU 编译的,但我也尝试过 x64 和 x86 编译(使用适当的 Oracle.DataAccess.dll 库)。

我在想这可能是一些超时,所以我尝试了不同的连接字符串选项,包括:
Validate Connection=true
Connection Lifetime=600;Connection Timeout=600;
池化=假
登记=假;
我什至将命令 CommandTimeout 设置为 600。

没有任何帮助 - 应用程序根据服务器负载下载不同数量的行 - 从 200k 到 300k 并引发 ORA-03113 异常。它大约需要 120 秒(但不完全是,有时是 130,有时更多,但大多数时间大约是 120 秒)。

奇怪的是,有时查询完成 OK,没有任何错误,下载所有 500k 行。例如,今天大约 30-40 次尝试失败,而 2 次成功。
同样奇怪的是,使用相同版本的 ODAC 驱动程序(用于 32 位系统)的相同应用程序每次在旧的 32 位 Windows 2003 Server 上运行良好。

新的 64 位服务器带有 Windows 2008 Server R2 Standard + SP1,所有实际更新,未安装防病毒软件。

我尝试了不同的配置:
- 安装 64 位 Oracle 驱动程序并使用 64 位 Oracle.DataAccess 库将应用程序编译到任何 CPU 和 x64,
- 安装 32 位 Oracle 驱动程序并使用 32 位 Oracle 将应用程序编译到任何 CPU 和 x86。数据访问库,

它们都不起作用。我注意到,有时我无法删除/重命名 Oracle 驱动程序目录,因为某些库被 MSDTC(分布式事务协调器)服务阻止。我尝试禁用它,将配置更改为与旧版本相同,增加服务器管理工​​具中的一些参数(其中包括:事务时间限制,从 60 秒到 0(无限制))。但我没有注意到任何改善。

我也尝试过禁用防火墙。

当连接中断 (?) 时,我在 Windows 事件日志中看不到任何匹配的警报或错误。

由于我对服务器管理没有经验,因此它主要使用默认值进行配置。它启用了 3 个角色:应用程序服务器、Web 服务器 (IIS) 和文件服务。

我与 Oracle 数据库服务器管理员交谈过,他向我保证,没有限制(超时、资源)设置,并且 Oracle 服务器日志没有显示任何错误。

再一次 - 相同的查询适用于 32 位 Windows 2003 Server,但不适用于 64 位 Windows 2008 Server。我还测试过,当我删除应用程序服务器和 Web 服务器角色时,它甚至在服务器上都不起作用(所以几乎很清楚)。

我还在家用 64 位 Windows7 笔记本电脑上测试了程序 + 64 位驱动程序,它工作正常

我假设Windows 2008 Server 上可能有一些设置 - 无论是超时还是资源,我可能会点击它并终止连接/事务,但我不知道如何检查或在哪里查看。所以,请你指出我有什么问题吗?

--编辑:
我注意到的另一件事:当查询成功完成时(上次我昨天晚上设法做到这一点 - 当服务器负载和连接负载很低时),查看 Oracle 会话监视器只有一个连接打开并且申请结束后不久关闭。但是,每次应用程序失败时,它都会留下 5 个打开的连接(使用 null 命令),这些连接在应用程序关闭后的几分钟内都不会消失。所以我认为处理连接池可能有问题......

4

1 回答 1

1

最后,经过多次测试,在网络管理员的帮助下,我:
1.将服务器代理更改为其他,
2.禁用 TCP/IPv6 协议,
3.禁用防火墙。
仍然不确定哪个是“有罪的”,但它看起来有帮助 - 我想这可能是我的或代理服务器上的 TCP/IPv6 的一些防火墙规则。

于 2013-01-15T12:43:51.223 回答