当多个用户连接到数据库时,VB6 数据库操作变慢

Posted

技术标签:

【中文标题】当多个用户连接到数据库时,VB6 数据库操作变慢【英文标题】:VB6 Database operations slow when multiple users connect to the database 【发布时间】:2012-10-25 23:38:08 【问题描述】:

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

以下是重现的步骤:

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

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

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

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

更多信息……

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

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

任何帮助将不胜感激!

谢谢!

【问题讨论】:

可能由于未正确处理计算机 B 注销而导致内存泄漏。你能分享你的代码吗? 如果两个用户可以同时在后端运行查询,并且速度不错,那么前端可能有问题。我知道让用户直接连接到后端并不常见,但这应该是一个可行的测试。 如果设计得当,我支持 Remou; split aceess 解决方案一次可支持多达 15 到 20 个用户。软件有多复杂;它只是一个缓慢的特定区域吗?还是一切;它是为多用户设计的吗?你有慢速部分的代码示例吗? 【参考方案1】:

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

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


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

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

【讨论】:

恐怕这不是真的。切换到 MS SQL Server 的成本很高——即使是免费版本也很昂贵,而且它也不是解决网络或代码问题的万灵药。 MS Access 是少数用户的不错选择。 我只能谈谈我自己的经验,那就是网络环境中的多用户存在间歇性性能和锁定问题。不确定您所指的关于 SQL Express 的费用是多少,除非您的意思是有一个盒子来运行它。而且您几乎可以购买一台 PC 以在更便宜且包含 Access 的 MS Office 版本上运行它。 访问 (Jet/ACE) 用作后端是免费的。如果 OP 遇到两个用户和 MS Access 的问题,我非常怀疑新数据库是否能解决问题。 如果它与锁定相关(在 Access 中锁定或在物理文件级别锁定),则很有可能。和往常一样,这是 an 答案,它可能不是 the 答案:) 如果表有一百万行,并且我们通过发票编号提取某些内容,那么只有 ONE ROW 的数据被拉下网络管道。 (以及平衡 btree 索引的极小部分叶子)。因此,使用链接表、SQL 服务器或链接表到文件共享意味着我们有效地只在网络上拉下一行。此外,如果您费心阅读该帖子,那么如果这是通过网络提取过多数据,那么用户如何指出网络性能对一个用户来说很好? (有点颠覆你的理论,不是吗?)。【参考方案2】:

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

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

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

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

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

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于当多个用户连接到数据库时,VB6 数据库操作变慢的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 VB6 Winsock 连接到票务打印机

连接到多个组件时的 Apollo 客户端查询和数据存储

vb6:如何在连接到智能卡时包含定义的 .dll

Django 多个数据库 - 无法连接到 mysql 服务器回退到 sqlite

VB6 连接到 WCF

如何使用域帐户使用 c# 连接到数据库?