4

我目前正在使用 VB6 使用 DAO 连接到 MS 访问数据库,当第二个用户连接到数据库时,我的速度明显降低。

以下是重现的步骤:

  • 通过登录软件从计算机 A 打开数据库

  • 通过软件将记录添加到数据库(大约需要 0.4 秒)

  • 第二个用户登录到软件(计算机 B),即:这会打开数据库,显示今天的交易,但用户什么也不做

  • 在计算机A上,重复添加记录的操作,现在该操作大约需要6秒

更多信息……</p>

  • 即使在计算机 B 退出软件后,该操作仍持续大约 6 秒

  • 如果您从计算机 A 关闭并重新打开应用程序,操作将返回到只需 0.4 秒即可执行!

任何帮助将不胜感激!

谢谢!

4

3 回答 3

1

当我们过渡到使用更新的文件服务器时,我们的 VB3 / Jet DB 2.5 应用程序遇到了这个问题。

问题是“机会锁定”: http: //support.microsoft.com/kb/296264 ?wa=wsignin1.0

阿尔伯特可能正在描述同样的事情;服务器将允许一个客户端独占访问文件,但是当另一个客户端加入时,这种独占访问将在它们之间“颠簸”,导致延迟,因为具有 oplock 的客户端在另一个客户端可以访问之前将其所有本地缓存​​刷新到服务器文件。

这也可能是您使用一个客户端获得良好性能的原因 - 如果它需要一个机会锁,它可以在本地缓存所有数据。

如果您的一个客户端出现电源故障或掉线,这也可能导致一些严重的损坏,因为将本地缓存刷新到服务器可能会被中断。

根据文章,您曾经能够在 Windows 2000 和 XP 上禁用此功能(在客户端上- 因此您需要为所有客户端提供服务),但在 Vista SP2 之后似乎是不可能的。

关于不使用 Access / JetDB 作为多用户数据库的评论基本上是正确的 - 这不是一个好的架构选择,尤其是鉴于上述情况。DAO 也是一个过时的库,即使在过时的 VB6 中也是如此。ADODB 是 VB6 的更好选择,并且应该允许您根据应用程序的编写方式来衡量数据库的独立性。

于 2013-05-14T15:29:21.823 回答
1

这就是 MS Access 的工作方式。虽然它有点支持多个用户,并且有点支持将数据库放在文件共享上以便多台 PC 可以访问它,但它都做得不好。而且,如果您同时进行这两种操作(多用户和通过网络共享文件),那么我会为您感到痛苦。

答案是运行升级向导并将其转换为 MS SQL Server 实例。MS SQL Server Express 版是替代 Acess 的好选择。请注意,您仍然可以将所有代码和报告等保留在 Access 中,只需要移动数据。


只是为了清楚区别,在 MS Access 中,当您从数据库中读取数据时,执行查询所需的所有数据都由您的程序从文件中读取,没有进行服务器端处理。如果该数据驻留在网络上,则您正在通过网络提取该数据。如果有多个用户,您将有额外的锁定开销。每个用户程序/进程通过文件 I/O 与其他用户的程序/进程有效对话(将锁定信息写入网络文件或文件)。如果网络 I/O 超时或有其他问题,那么这些文件可能会损坏。

在 SQL Server 中,管理数据请求并仅返回所需数据的是 SQL Server 引擎。它还可以管理锁,并可以检测客户端何时断开连接或超时清理,从而减少网络上的多个用户引起的问题。

于 2012-11-06T12:52:08.147 回答
0

正如您指出的那样,您在系统上使用一个用户可以获得不错的性能,那么显然您的应用程序本质上不会通过网络提取太多数据,我们不能在这里责怪网络速度。

事实上,Windows 文件共享系统正在从单一文件共享模式切换到多文件共享模式。这种切换文件模式会导致显着延迟。这也意味着第二个或更多用户必须尝试找出并设置文件锁定。

要消除这种明显的延迟,只需在您的应用程序开始时打开我们所说的持久连接。持久连接只是强制网络连接始终保持打开状态,因此消除了在文件共享的两种文件模式之间切换的显着延迟。您现在发现两个用户的性能应该与一个用户相同(假设一个用户空闲并且没有增加网络负载)。因此,在应用程序启动时,打开一个全局变量的后端表,并始终保持该表打开。

于 2012-11-07T01:13:08.083 回答