【问题标题】:Issue with System.Data.OracleClient and ODP.Net 11g together used in .net 2.0 web siteSystem.Data.OracleClient 和 ODP.Net 11g 在 .net 2.0 网站中一起使用的问题
【发布时间】:2013-02-08 23:00:03
【问题描述】:

在我们基于 .net framework 2.0 的应用程序中,我们使用 System.Data.Oracleclient 现在迁移到 ODP.Net,项目量太大, 因此我们无法一次性完成整个迁移,因此应用程序目前使用 2 个提供程序 System.Data.Oracleclient 和 ODP.Net。

现在我们正在更改我们的操作系统,从 Windows xp 32 位到 Windows 7 64 位。在此过程中,我们观察到以下情况,

1) 使用 System.Data.Oracleclient 和 ODP.Net 10g 64 位(Oracle.DataAccess.dll 版本 2.102.2.20)在

2) 但是,使用 System.Data.OracleClient 和 ODP.Net 11g 64 位(Oracle.DataAccess.dll 版本 2.112.3.0)执行相同的查询需要 2-3 分钟。

我们在第 2 点中发现了显着的性能下降), 我们必须在 Windows 7 64 位操作系统上使用 System.Data.OracleClient 和 ODP.Net 11g 64 位(Oracle.DataAccess.dll 版本 2.112.3.0), 但我们不能忍受第 2 点中提到的性能下降), 而且我们无法将所有使用 System.Data.OracleClient 的代码快速转换为 ODP.Net。

那么任何人都可以帮助我们,为什么我们会看到第 2 点中提到的如此显着的性能下降,以及我们如何解决这个问题。

问候 桑吉布·哈乔杜里

【问题讨论】:

    标签: odp.net system.data.oracleclient


    【解决方案1】:

    将以下内容添加到您的配置中会将 odp.net 跟踪信息发送到日志文件:

      <oracle.dataaccess.client>
        <settings>
          <add name="TraceFileName" value="c:\temp\odpnet-tests.trc"/>
          <add name="TraceLevel" value="63"/>
        </settings>
      </oracle.dataaccess.client>
    

    这可能只有在您能及时找到较大的时间间隔时才有用。很有可能确实有行进来,只是速度较慢。

    尝试将“enlist=false”添加到您的连接字符串中。我不认为这是一个解决方案,因为它有效地禁用了分布式事务,但它应该可以帮助您隔离问题。您可以从oracle forumns post 获得更多信息:

    从 ODP 的角度来看,我们真正能指出的是, 行为发生在 OCI_ATR_EXTERNAL_NAME 和 OCI_ATR_INTERNAL_NAME 在底层 OCI 连接上设置(当 distrib tx 支持已启用)。

    我猜你没有看到的是 odp.net 调用和 sql 开发者调用之间的执行计划实际上是不同的(意味着实际的性能损失实际上发生在服务器上)。让您的 dba 跟踪连接并从 odp.net 调用和直接从 SQL Developer 调用(或使用 enlist=false 参数)获取执行计划。

    如果您确认不同的执行计划,或者如果您想在黑暗中抢先一步,更新相关表的统计信息。在我的例子中,这纠正了这个问题,表明执行计划的生成并没有真正遵循针对不同类型连接的不同规则,但是当可能涉及分布式事务时,成本分析稍微悲观一些。强制执行计划的查询提示也是一种选择,但只能作为最后的手段。

    最后,可能是网络问题。如果您的 odp.net 安装使用的是新的 oracle 主目录(除非您进行了一些安装后配置,否则我会期望它),那么 tnsnames.ora 可能会有所不同。主机名可能不是完全限定的,从而造成解析服务器的更多延迟。在这种情况下,我只希望第一次尝试(而不是后续尝试)会很慢,所以我认为这不是问题,但我认为应该提到它。

    【讨论】:

    • 感谢您的回复,查看 Tracing 的建议,当我在笔记本电脑中将 ODP.Net 11g 64bit 替换为 ODP.Net 10g 64 位并使用 System.Data 执行相同的查询时。 OracleClient 组件,一切正常,不能说是查询执行或网络相关问题。我也在 ODP.Net 论坛上提出了这个问题,希望有任何解决方案。
    • 您是否尝试将 enlist=false 添加到您的连接字符串中?
    • 是的,我尝试使用该选项,但没有帮助,但尽管我用 ODP.Net 11g 32 位替换了 ODP.Net 11g 64 位,如此处所述,link 并且它有效。也感谢您的意见。
    • 我现在想知道您的 64 位安装是否只是损坏了。
    • 嗯,我的第一个想法是在那条线上,因为我使用了另一个仅使用 ODP.Net 64 位组件的测试网站。在那里我提出了相同的查询,它工作正常。我猜在 64 位 Windows 中 System.Data.OracleClient 和 ODP.Net 64 位存在问题,大多数人可能会在他们的应用程序中使用任何一个,而不是两者都使用,因此可能不会以这种方式进行探索。
    【解决方案2】:

    请参考link,或者只是用 ODP.Net 32​​bit 替换 ODP.Net 64bit 组件,因为我们使用的是 asp.net,我们可以轻松配置我们的应用程序以使用 Windows 7 (x64) 版本中的 32bit 组件运行.

    【讨论】:

    • 如果您的应用程序以 32 位运行没问题,但这有效地消除了 64 位操作系统对您的应用程序的内存寻址优势。我也认为这是侥幸,因为我经常参考和使用这两个位版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2010-10-16
    • 1970-01-01
    • 2011-11-21
    • 2011-08-28
    • 2011-05-17
    • 1970-01-01
    相关资源
    最近更新 更多