【问题标题】:Speed Difference between native OLE DB and ADO.NET本机 OLE DB 和 ADO.NET 之间的速度差异
【发布时间】:2011-02-05 02:08:09
【问题描述】:

我正在寻找建议以及人们的任何基准或观察结果。我们正在寻求重写我们的数据访问层,并试图在本地 C++ OLEDB 或 ADO.NET 之间做出决定以连接数据库。目前,我们专门针对 Oracle,这意味着我们将使用 Oracle OLE DB 提供程序和 ODP.NET。

要求: 1. 所有应用程序都将在托管代码中,因此使用本机 C++ OLEDB 将需要 C++/CLI 才能工作(没有 PInvoke 方式来减慢速度)。 2. 应用程序将来必须与多个数据库一起工作,目前只是专门针对Oracle。

问题: 1. 使用 ADO.NET 来完成此任务,还是使用封装在托管 C++ 接口中以供托管代码访问的本机 C++ OLE DB 会更高效?

任何想法、帮助或在网络上查看的地方将不胜感激。

【问题讨论】:

    标签: database performance oracle ado.net oledb


    【解决方案1】:

    考虑到您想要的不仅仅是 Oracle 的通用解决方案,我认为不可能给出一个普遍适用于这种情况的单一答案。问题是一个供应商的 .NET 提供程序可能比他们的 OLE DB 提供程序更快,反之亦然。这两种数据访问技术的架构有很大不同。

    不过,我的直觉是速度差异不会那么大。因为听起来您会将自己的数据访问层放在 OLE DB 之上,所以在您编写之前很难直接比较。但总的来说,任何数据修改语句(例如,UPDATE mytable set…)在任何一种情况下都可能不会有太大的不同。使用这两种技术,您可以在适当的情况下指定参数数据,然后将命令发送到服务器。大部分成本可能是网络延迟和服务器执行时间。在读取数据集时,最大的区别可能会发挥作用。

    读取数据将成为显示速度差异的因素。根据您的计划,您可能希望在低级别读取数据。例如,对于 OLE DB,您可以调用 IRowset::GetNextRows。使用 .NET,您可能会通过 DbDataReader::Read() 读取数据集。我不知道这是否是典型的,但在我处理的代码中,OLE DB GetNextRows() 方法比 .NET Read() 实现复杂得多。我不确定这是否一定会导致执行速度变慢……但它可能会。

    在我看来,最好的选择是使用 ADO.NET。由于它是 Microsoft 当前的数据访问技术,我怀疑供应商会比他们的 OLE DB 提供程序更频繁地更新他们的 .NET 提供程序。因此,如果在实现中出现性能问题,.NET 提供程序可能会得到修复,而他们的 OLE DB 提供程序可能不会及时(或根本)修复。此外,如果您需要,可以使用 .NET 提供程序(例如实体框架)获得更大的灵活性。如果您想使用 OLE DB,您将需要为 OLE DB 提供程序使用 .NET 提供程序,这是 OLE DB 之上的另一层(假设它甚至可以工作,我不知道)。

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 1970-01-01
      • 2010-09-20
      • 2010-12-17
      • 2012-10-19
      • 1970-01-01
      • 2014-04-20
      • 2010-09-13
      • 2015-09-10
      相关资源
      最近更新 更多