我目前正在使用VB6使用DAO连接到MS访问数据库,当第二个用户连接到数据库时,我的速度降低非常明显。
以下是重现的步骤:
登录软件
通过软件将记录添加到数据库中(大约需要0.4秒)
第二个用户登录软件(计算机B),即:这将打开数据库,显示今天的交易,但用户不做任何其他事情
在计算机A上,重复添加记录的操作,现在操作大约需要6秒
更多信息......
即使在计算机B退出软件后,操作仍会持续约6秒钟
如果您关闭并从计算机A重新打开应用程序,操作将返回仅执行.4秒执行!
非常感谢任何帮助!
谢谢!
答案 0 :(得分:1)
这就是MS Access的工作方式。虽然种类支持多个用户,而种类支持将数据库放在文件共享上,因此多台PC可以访问它,但它并不是很好。如果你同时做这两件事(多用户和通过网络到文件共享),那么我感到痛苦。
答案是运行升级向导并将其转换为MS SQL Server实例。在这种情况下,MS SQL Server Express版本是替换Acess的不错选择。请注意,您仍然可以保留Access中的所有代码和报告等,只需要移动数据。
为了清楚区别,当您从数据库中读取数据时,在MS Access中,您的程序会从文件中读取执行查询所需的所有数据 没有服务器端处理。如果该数据驻留在网络上,您将通过网络提取该数据。如果有多个用户,则会产生额外的锁定开销。每个用户通过文件I / O(将锁定信息写入网络文件或文件)有效地与其他用户的程序/进程对话。如果网络I / O超时或有其他问题,那么这些文件可能会损坏。
在SQL Server中,它是管理数据请求的SQL Server引擎,仅返回所需的数据。它还可以管理锁定,并可以检测客户端何时断开连接或超时清理,从而减少网络上多个用户造成的问题。
答案 1 :(得分:1)
当我们转换到使用更新的文件服务器时,我们的VB3 / Jet DB 2.5应用程序遇到了这个问题。
问题是“机会锁定”:http://support.microsoft.com/kb/296264?wa=wsignin1.0
阿尔伯特可能正在描述同样的事情;服务器将允许一个客户端独占访问一个文件,但是当另一个客户端进入时,这个独占访问将在它们之间“捶打”,导致延迟,因为带有oplock的客户端将所有它的本地缓存刷新到服务器,然后另一个客户端才能访问文件。这也可能是您使用一个客户端获得良好性能的原因 - 如果它需要一个oplock,它可以在本地缓存所有数据。
如果您的某个客户端出现电源故障或网络中断,这也可能导致一些令人讨厌的损坏,因为这可能会中断本地缓存到服务器的冲刷。
根据文章,您曾经能够在Windows 2000和XP上禁用此功能(在客户端上 - 因此您需要为所有客户端提供服务),但在Vista SP2之后它似乎是不可能的。
关于不使用Access / JetDB作为多用户数据库的评论基本上是正确的 - 它不是一个好的架构选择,特别是考虑到上述情况。即使在过时的VB6中,DAO也是一个过时的库。 ADODB是VB6的更好选择,应该允许您根据应用程序的编写方式来衡量数据库的独立性。
答案 2 :(得分:0)
由于你指出你在系统上有一个用户可以获得不错的性能,显然你的应用程序本质上不是通过网络吸引过多的数据,我们不能责怪网络速度。
实际上正在发生的是Windows文件共享系统正在从单个文件共享模式切换到多共享文件模式。这种切换文件模式会导致严重的延迟。这也意味着第二个或更多用户必须尝试找出并设置文件上的锁。
要在应用程序开始时删除这个明显的延迟,请打开我们称之为持久连接的内容。持久连接只是迫使网络连接始终保持打开的因素,因此消除了在文件共享的两种文件模式之间切换的这种显着延迟。您现在发现两个用户的性能应该与一个用户相同(假设一个用户空闲且不增加网络负载)。因此,在应用程序启动时,将后端表打开到全局变量表并保持该表始终打开。