【问题标题】:Is it really wise to close connections immediately with Jet/ADO?立即关闭与 Jet/ADO 的连接真的很明智吗?
【发布时间】:2009-08-12 07:30:23
【问题描述】:

我对这个主题进行了广泛的研究,并与我的同事进行了深入的讨论。

普遍的共识似乎是,数据库连接应该在需要时打开并立即关闭。任何连接的缓存/池化都应该由数据库驱动程序或其他一些层完成,而不是由应用程序本身完成。

但我对 Jet/ADO 有疑问。 Jet 和/或 ADO 使用读取缓存和延迟写入,这可能导致"unsynchronized" connections。当然,我可以在每次使用 JRO 时重新同步连接,但这似乎很麻烦,而且可能会消耗性能。

我应该采用关闭每个连接并重新同步每个新连接的“最佳实践”,还是应该因为 Jet/ADO 怪癖而只采用全局连接对象?

【问题讨论】:

    标签: ms-access vb6 connection ado jet


    【解决方案1】:

    Jet/ACE 的一个问题是锁定文件 (*.ldb) 的创建会导致显着的性能损失。此外,如果 LDB 已经存在(因为连接了另一个用户),设置锁定可能需要很长时间。

    因此,您希望最大限度地减少应用连接的次数,因为您可能会在不断地重新创建和重新连接到 LDB 文件上浪费时间。

    在 Access 应用程序中,maintain a persistent connection 是许多程序员的常见做法。

    通常的建议是以隐藏形式打开表格或打开表格上的记录集。我更喜欢初始化一个指向后端的数据库变量。 Tony 在引用的文章中的反对意见对我来说似乎微不足道——解析连接字符串并不难,例如 Mid(CurrentDB.TableDefs("MyLinkedTable").Connect, 11)。

    在非 Access 上下文中,您会遇到同样的问题,因为这是 Jet/ACE 数据库引擎问题。当然,维护打开连接的特定方法会有所不同,但关键是保持打开连接意味着数据库引擎对锁定文件的争用更少。

    【讨论】:

      【解决方案2】:

      我认为最好为 VB6 桌面应用程序使用一个全局连接。理想情况下,数据库驱动程序会透明地管理连接池,但是当您在 VB6 中使用带有 ADO 或 DAO 的 Jet 时,它不会:OLE DB Jet Provider doesn't have connection pooling。我相信 .NET 提供商会这样做。

      我假设您的应用程序是桌面应用程序 - 您实际上并没有指定。我没有 IIS 应用程序或 COM+ 的经验,所以我不知道那里最好的是什么。可能不使用 Jet Access!不过,这对于桌面应用程序来说很好。

      【讨论】:

      • 虽然我同意 Jet 可能不是基于 Web 的应用程序的最佳数据存储,但它可以很好地用于 VB6 应用程序,这是原始海报的情况。因此,-1。
      • @David:VB6 用于 IIS 应用程序和 COM+。原始帖子使用“应用程序”,这意味着它是一个桌面应用程序——这就是我首先介绍它的原因——但它也使用了“层”,这对我来说暗示了 IIS 或 COM+。
      • 澄清一下 - 我维护了几个桌面应用程序,其中有许多使用 VB6/Jet Access 的用户,它确实可以正常工作。
      【解决方案3】:

      我工作的最后两个大型 VB6 + ADO + Access 数据库引擎应用程序(两个不同的团队/雇主)使用了相同的方法:

      • 使用客户端光标
      • 保持ADODB.Connection 开放
      • 立即断开每个 ADODB.Recordset 使用 Set rs.ActiveConnection = Nothing

      【讨论】:

        【解决方案4】:

        大多数现代 DBMS 都提供 ConnectionPool 来管理连接。但是,当您使用 连接.close(); 你并没有真正关闭连接,它只是将它返回到池中,当你写的时候 连接.open(); 实际上,它不会创建新连接,您只是在 ConnectionPool 中准备好连接并使用它。

        所以每次你想将查询传递给 DBMS 时打开连接并关闭它是最好的方法,我不会导致性能问题,除了 您不能对多个数据读取器 SQLDataReader 使用相同的连接。

        因为不使用全局连接,尤其是在开发网站时 因为当您的网站流量很大时,当两个用户解析您的页面时,它会随机抛出异常,导致 2 个数据阅读器尝试使用相同的连接。

        【讨论】:

        • 但是 Jet/ADO 的同步问题呢?
        • -1。我认为这个答案适用于 VB.NET 而不是 VB6? SQLDataReader 绝对是一个 .NET 的东西。 Jet 的 ADO OLE DB 提供程序 提供连接池,尽管我认为 .NET 提供程序提供。 support.microsoft.com/kb/191572
        • 这不是现有的“vb6”标签,而是缺少的“ado.net”标签 :) 老实说,我只是添加了“vb6”,因为我担心有人会将 ADO 与 ADO.net 混淆 :)
        • 也许我们需要一个“ADO (not ADO.NET)”标签。当然,更好的是“经典 ADO”。
        • @David W. Fenton:“ADODB”标签可以在这里应用。
        猜你喜欢
        • 2012-08-04
        • 2012-02-22
        • 2017-03-20
        • 2022-07-30
        • 2020-04-22
        • 1970-01-01
        • 2015-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多