8

我创建了一个 MS Access 2003 应用程序,设置为分离的前端/后端配置,用户组约为 5 人。前端 .mdb 位于网络文件服务器上,它包含所有查询、表单、报告和 VBA 代码,以及指向后端 .mdb 中所有表的链接以及一些指向 ODBC 数据源(如 AS/)的链接400。后端位于同一网络文件服务器上,其中只有表数据。

这一直运行良好,直到我“上线”并且我的少数用户开始提出增强请求、错误报告等。我一直在通过在我自己的前端 .mdb 副本中开发/测试来推出新代码另一个网络文件夹(链接到相同的后端 .mdb),然后将我完成的文件发布到“come-and-get-it”文件夹中,提醒用户,然后他们去复制/粘贴新的前端文件到他们自己在网络上的文件夹中。这样,每个用户都可以在他们处于“停止点”时更新他们的前端,而无需立即启动每个人。

我发现现在在开发时,有时Access会变得非常慢。就像,当我正在开发表单并尝试单击属性框上的下拉菜单时,下拉箭头将推入,但需要几秒钟才能出现选项列表。或者在表单上选择和移动控件时存在大量滞后。或者很多键盘滞后。

然后,在其他时候,根本没有滞后。

我想知道是否是因为我与其他用户链接到同一个后端。我确实做出了合理的努力来设置查询、表单、报告等,并根据需要使用最少的记录锁定(如果有的话)。但是我可能遗漏了一些东西,或者可能还有其他一些我需要解决的性能问题。

但是我想知道是否有更好的方法来设置我自己的开发后端.mdb,这样我就可以在“安全”数据上测试我的代码,而不是与其他用户相同的实时数据. 恐怕我破坏一些数据只是时间问题,可能是在最糟糕的时刻。

显然,我可以只设置一个单独的后端 .mdb 并每次使用链接表管理器手动重新配置前端中的表链接。但我希望有一个比这更优雅的解决方案。

而且我想知道在这个多用户拆分数据库配置中是否还有其他性能问题我应该考虑。

编辑:我应该补充一点,我坚持使用 MS Access(不是 MS-SQL 或任何其他“真实”后端);有关更多详细信息,请参阅我对这篇文章的评论。

4

8 回答 8

13

如果您的所有用户都共享前端,那就是错误的配置。

每个用户都应该拥有一份单独的前端副本。共享前端肯定会导致共享前端的频繁损坏,以及前端中表单和模块的奇怪损坏。

我不清楚如何在最终用户使用的前端副本中进行开发,因为从 A2000 开始,这是被禁止的(因为“整体保存模型”,整个 VBA 项目都存储在其中在其中一个系统表的单个记录中的单个 BLOB 字段中)。

我真的不认为这些问题是由使用生产数据引起的(尽管正如其他人所说,针对生产数据进行开发可能不是一个好主意)。我认为它们是由糟糕的编码实践和前端代码缺乏维护造成的。

  1. 在 VBE 选项中关闭 COMPILE ON DEMAND。

  2. 确保您需要 OPTION EXPLICIT。

  3. 每隔几行代码就频繁地编译你的代码——为了简单起见,将编译按钮添加到你的 VBE 工具栏(当我在它的时候,我还添加了 CALL STACK 按钮)。

  4. 定期备份您的前端并反编译和重新编译代码。这是通过使用 /decompile 开关启动 Access,打开前端,关闭 Access,使用 Access 打开前端(按住 SHIFT 键绕过启动代码),然后压缩反编译的前端(使用 SHIFT键),然后编译整个项目并最后一次压缩。您应该在任何主要代码发布之前执行此操作。

其他一些想法:

  1. 你没有说它是否是 Windows 服务器。通过 SAMBA 访问的 Linux 服务器过去曾出现过问题(尽管有些人对它们发誓并说它们比 Windows 服务器快得多),并且从历史上看,Novell 服务器需要调整设置以使 Jet 文件能够被可靠地编辑。还有一些设置(如 OPLOCKS)可以在 Windows 服务器上进行调整,以使事情更好地工作。

  2. 将您的 Jet MDB 存储在具有短路径的共享中。\Server\Data\MyProject\MyReallyLongFolderName\Access\Databases\ 读取数据将比 \Server\Databases 慢得多。这真的有很大的不同。

  3. 链接表存储可能会过时的元数据。有两个简单的步骤和一个激烈的步骤来修复它。先压缩后端,再压缩前端。那是最容易的。如果这没有帮助,请完全删除链接并从头开始重新创建它们。

  4. 您也可以考虑将 MDE 分发给最终用户而不是 MDB,因为它不能反编译(MDB 可以)。

  5. 有关其他通用性能信息,请参阅Tony Toews 的性能常见问题解答。

于 2009-05-21T21:05:28.260 回答
2

1) 从代码 http://www.mvps.org/access/tables/tbl0009.htm重新链接访问表

一旦我准备好向用户发布新的 MDE,我重新链接表,制作 MDE 并将 MDE 复制到服务器。

2) 我专门创建了免费的 Auto FE Updater 实用程序,以便我可以根据需要随时更改 FE MDE,并且非常有信心下次有人运行该应用程序时它会引入最新版本。有关错误或 Auto FE Updater 实用程序的更多信息,请参阅我网站上http://www.granite.ab.ca/access/autofe.htm上的免费 Auto FE Updater 实用程序,以使每台 PC 上的 FE 保持最新.

3) 现在,在客户现场工作时,我会在每个人都离开系统的几个小时后更新表结构。请参阅如何:检测 Access 2000 中的用户空闲时间或不活动 (Q210297) http://support.microsoft.com/?kbid=210297 ACC:如何检测用户空闲时间或不活动 (Q128814) http://support.microsoft .com/?kbid=128814

但是我们发现,在定时器事件上运行的代码必须为程序员禁用。否则,当您编辑代码时,就会发生奇怪的事情。

此外,打印预览有时不允许用户运行菜单项以将报告导出到 Excel 或其他。因此,您必须右键单击 Previewed 报告以使某种类型的内部焦点重新回到报告上,以便他们可以将其导出。这也有助于将计时器延长到五分钟。

将计时器延长至五分钟的不利之处在于,如果一个人在一天中的相当长的时间里保持相同的形式和相同的控制,即某人进行相同的查询,例程并没有意识到他们实际上已经做了某事。每当他们在程序中执行某些操作时,我会在某个时候添加一些逻辑来重置此计时器。

4)关于另一个人评论脚本等更新架构,请参阅Compare'Em http://home.gci.net/~mike-noel/CompareEM-LITE/CompareEM.htm。虽然它有其怪癖,但它确实创建了 VBA 代码来更新表、字段、索引和关系。

于 2009-05-22T03:20:07.023 回答
1

从 dev 切换到 prod 时,使用 VBA 取消链接并将表重新链接到新目标。我已经很多年才记住语法——我只知道这个函数写起来很简单。

或者使用 MS-Access 通过 ODBC 或其他位于客户端 mdb 之外的数据连接与 MS-Access 对话。

与所有基于文件的数据库一样,您最终会遇到峰值使用问题,或者当您超过 2 到 30 之间的一个小神奇数字时。

此外,Access 往往会经常损坏,因此需要经常进行备份、压缩和修复。曾经存在的第 3 方工具可以自动执行此任务。

就性能而言,数据是在客户端处理的,因此您可能希望使用 netmeter 之类的东西来观察有多少数据通过网络传输。关于索引和避免表扫描的相同原则也适用于文件基础数据库。

于 2009-05-21T11:26:46.930 回答
1

其他人的许多好建议。这是我的 2 美分。我的后端数据位于通过驱动器映射访问的服务器上。就我而言,Y 驱动器。生产用户使用活动目录通过登录脚本获取映射。然后通过批处理文件轻松完成以下场景:

  • 通过在批处理文件中执行 subst 命令针对本地计算机进行开发
  • 通过将 Y 指向备份服务器来针对昨晚的数据运行报告(只读)
  • 通过指向正确的目录运行月末数据报告
  • 通过保留一个特殊目录来针对特殊场景进行测试

在我的环境中(平均 5 个并发用户,1000 行,而不是 10,000 行。)发生了损坏,但它很少见且易于管理。在过去的几年中,我们只有一次求助于前几天的备份。我们使用 SQL Server 来处理更高容量的东西,但开发起来不太方便,可能是因为我们现场没有 SQL 管理员。

于 2009-05-21T12:23:39.297 回答
0

如果您想在向客户端发布新的 FE 时自动更新后端 MDB 架构,请参阅 Compare'Em http://home.gci.net/~mike-noel/CompareEM-LITE/CompareEM.htm会很高兴地生成VBA 代码需要重新创建 MDB。或者创建两个 MDB 之间差异的代码,以便您可以对现有的 BE MDB 进行版本升级。这有点古怪,但有效。

我用它所有的时间。

于 2009-06-23T08:02:18.370 回答
0

您可能还会发现这个问题的一些答案(如何从访问中提取模式)也很有用。使用建议的一种技术提取模式后,您将获得一系列新选项,例如对模式使用源代码控制的能力,以及能够轻松构建“干净”测试环境的能力。

编辑以回应评论:没有简单的方法可以以本机格式对 Access 数据库进行源代码控制,但架构文件就像任何其他文件一样只是文本文件。因此,您可以将它们签入和签出您选择的源代码控制软件,以便于版本控制/回滚。

或者,当然,它依赖于您设置了一系列脚本来从模式中重新构建您的数据库。一旦你这样做了,创建一个在不同位置重建它的选项/替代版本通常相当简单,允许你从任何以前提交的模式版本构建测试环境。我希望澄清一点!

于 2009-05-21T11:36:35.867 回答
-1

您需要了解数据的共享 mdb 文件不是一个可靠的解决方案。Microsoft 会建议 SQL Server 或其他一些基于服务器的数据库将是一个更好的解决方案,并允许您使用相同的访问前端。如果您想这样做,迁移向导将帮助您进行转换。

正如另一个用途所指出的那样,会发生腐败。这只是一个频率问题,而不是是否。

要了解性能问题,您需要了解对于服务器而言,其中包含数据的 mdb 文件就是一个文件。由于服务器上没有运行代码,服务器不理解事务、记录锁定等。它只知道有一个文件是一堆人同时试图读写的。

拥有SQL Server、Oracle、DB2等数据库系统。MySQL 等数据库程序在服务器上运行,并将服务器视为访问数据库文件的单个程序。它是数据库程序(在服务器上运行),它处理记录锁定、事务、并发、日志记录、数据备份/恢复以及人们希望从数据库中获得的所有其他好处。

由于设计为在服务器上运行的数据库程序旨在做到这一点,并且只做到这一点,因此它可以比 Access 读取和写入共享文件 (mdb) 之类的程序做得更好、更有效。

于 2009-05-21T11:39:35.267 回答
-2

针对实时数据进行开发有两条规则

第一条规则是。. . 永远不要针对实时数据进行开发。永远不会。

第二条规则是。. .从不针对实时数据进行开发。永远不会。

您可以以编程方式更改链接表的绑定,因此您可以编写一个宏来在部署新版本时更改链接。

该应用程序很慢,因为它是 MS Access,并且它不喜欢很多并发用户(其中​​许多是任何数字 > 1)。

于 2009-05-21T11:26:05.950 回答