2

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

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

但我对 Jet/ADO 有疑问。Jet 和/或 ADO 使用可能导致“不同步”连接的读取缓存和延迟写入。当然,每次我使用 JRO 使用它们时,我都可以重新同步连接,但这似乎很麻烦,并且可能会消耗性能。

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

4

4 回答 4

5

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

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

在 Access 应用程序中,维护持久连接是许多程序员的常见做法。

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

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

于 2009-08-12T19:33:41.710 回答
3

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

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

于 2009-08-12T08:52:53.707 回答
2

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

  • 使用客户端光标
  • 保持ADODB.Connection开放
  • 立即断开每个 ADODB.Recordset使用Set rs.ActiveConnection = Nothing
于 2009-08-12T09:24:02.710 回答
1

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

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

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

于 2009-08-12T08:06:23.113 回答