我创建了一个MS Access 2003应用程序,设置为拆分前端/后端配置,用户组大约有五个人。前端.mdb位于网络文件服务器上,它包含所有查询,表单,报告和VBA代码,以及后端.mdb中所有表的链接以及一些指向ODBC数据源的链接,如AS / 400。后端位于同一网络文件服务器上,它只包含表数据。
这一直运行良好,直到我“上线”并且我的少数用户开始提出增强请求,错误报告等。我已经通过在我自己的前端副本中开发/测试来推出新代码.mdb在另一个网络文件夹中(链接到同一个后端.mdb),然后将我完成的文件发布到“come-and-get-it”文件夹中,提醒用户,然后他们复制/粘贴新的前端文件到网络上自己的文件夹。这样,每个用户都可以在他们处于“停止点”时更新他们的前端,而无需立即启动所有人。
我发现当我正在开发时,有时Access变得非常慢。就像,当我开发一个表单并尝试单击属性框上的下拉列表时,下拉箭头将会推入,但是在选项列表出现之前需要几秒钟。或者选择&移动窗体上的控件。或许多键盘滞后。
然后,在其他时候,根本没有滞后。
我想知道是不是因为我与其他用户链接到同一个后端。我确实做了一些合理的努力来设置查询,表单,报告等,最小的记录锁定,如果有的话,根据需要。但我可能已经遗漏了一些东西,或者可能还有一些我需要解决的性能问题。
但是我想知道是否有更好的方法来设置我自己的开发后端.mdb,所以我可以在“安全”数据上测试我的代码而不是与其他数据相同的实时数据用户我担心损坏一些数据只是时间问题,可能是在最糟糕的时刻。
显然,我可以设置一个单独的后端.mdb,并使用链接表管理器每次手动重新配置前端的表链接。但我希望有一个更优雅的解决方案。
我想知道在这个多用户拆分数据库配置中是否还有其他性能问题。
编辑:我应该补充一点,我坚持使用MS Access(不是MS-SQL或任何其他“真正的”后端);有关详细信息,请参阅我对此帖的评论。
答案 0 :(得分:12)
如果您的所有用户都在共享前端,那就是错误的配置。
每个用户都应拥有前端的单独副本。保证共享前端会导致共享前端频繁损坏,以及前端表单和模块的奇怪损坏。
我不清楚你是如何在最终用户正在使用的前端的同一副本中开发的,因为从A2000开始,这是禁止的(因为“整体保存模型”,整个VBA project存储在一个系统表中的单个记录中的单个BLOB字段中。
我真的不认为这些问题是由使用生产数据造成的(尽管根据其他人的说法对生产数据进行开发可能不是一个好主意)。我认为它们是由糟糕的编码实践和前端代码缺乏维护造成的。
在VBE选项中关闭COMPILE ON DEMAND。
确保您需要OPTION EXPLICIT。
经常在每几行代码之后编译代码 - 为了方便起见,将COMPILE按钮添加到VBE工具栏(当我在它时,我还添加了CALL STACK按钮)。 / p>
定期备份前端并反编译并重新编译代码。这是通过使用/ decompile开关启动Access,打开前端,关闭Access,使用Access打开前端(按住SHIFT键以绕过启动代码),然后压缩反编译的前端(使用SHIFT)来实现的。按键),然后编译整个项目并最后一次压缩。您应该在任何主要代码发布之前执行此操作。
其他一些想法:
您没有说它是否是Windows服务器。通过SAMBA访问的Linux服务器过去曾遇到过问题(尽管有些人发誓说它们比Windows服务器快得多),而且历史上Novell服务器需要调整设置以使Jet文件可靠地编辑。还有一些设置(如OPLOCKS)可以在Windows服务器上进行调整,以使工作更好。
将Jet MDB存储在具有短路径的共享中。 \ Server \ Data \ MyProject \ MyReallyLongFolderName \ Access \ Databases \读取数据要比\ Server \ Databases慢得多。这确实产生了巨大的差异。
链接表存储可能过时的元数据。有两个简单的步骤,一个急剧的步骤来解决它。首先,压紧后端,然后压紧前端。这很简单。如果这没有帮助,请完全删除链接并从头开始重新创建。
您可能还考虑将MDE分发给最终用户而不是MDB,因为它无法解压缩(MDB可以)。
有关其他广义效果信息,请参阅Tony Toews's Performance FAQ。
答案 1 :(得分:2)
1)从代码重新链接访问表 http://www.mvps.org/access/tables/tbl0009.htm
一旦我准备好向用户发布新的MDE,我重新链接表,制作MDE并将MDE复制到服务器。
2)我专门创建了免费的自动FE更新程序实用程序,以便我可以根据需要随时更改FE MDE,并且相信下次有人去运行应用程序时会更新版。有关错误或自动FE更新程序实用程序的详细信息,请参阅我的网站http://www.granite.ab.ca/access/autofe.htm上的免费自动FE更新程序实用程序,以使每台PC上的FE保持最新。
3)现在,当客户在现场工作时,我会在每个人都不在系统之后的几个小时内对表结构进行更新。请参阅如何:在Access 2000中检测用户空闲时间或不活动(Q210297)http://support.microsoft.com/?kbid=210297 ACC:如何检测用户空闲时间或不活动(Q128814)http://support.microsoft.com/?kbid=128814
但是我们发现必须为程序员禁用在timer事件上运行的代码。当你编辑代码时,会发生奇怪的事情。
此外,打印预览有时也不允许用户运行菜单项以将报告导出到Excel或其他人。因此,您必须右键单击“预览”报告,以便在报告上获得某种类型的内部焦点,以便他们可以将其导出。将计时器延长到五分钟也有助于此。
将计时器延长到五分钟的缺点是,如果一个人在一天的大部分时间内保持相同的形式和相同的控制,即有人做同样的查询,例程没有意识到他们实际上做了一些事。每当他们在程序中执行某些操作时,我会在某个时候输入一些逻辑来重置此计时器。
4)在引用其他人评论脚本等更新架构时,请参阅Compare'Em http://home.gci.net/~mike-noel/CompareEM-LITE/CompareEM.htm。虽然它有它的怪癖,它确实创建了VBA代码来更新表,字段,索引和关系。
答案 2 :(得分:1)
在从dev切换到prod时,使用VBA取消链接并将表重新链接到新目标。多年来我一直记住语法 - 我只知道函数编写起来很简单。
或者使用MS-Access通过ODBC或客户端mdb之外的其他数据连接与MS-Access通信。
与所有文件库数据库一样,您最终会遇到峰值使用问题,或者当您在2到30之间查看一个小的神奇数字时会遇到问题。
此外,Access往往会频繁损坏,因此需要经常进行备份,紧凑和修复。过去存在第三方工具来自动完成此任务。
就性能而言,数据正在客户端进行处理,因此您可能希望使用netmeter这样的内容来监视线路上有多少数据。关于索引和避免表扫描的相同原则也适用于文件库dbs。
答案 3 :(得分:1)
其他人的许多好建议。这是我2百万的价值。我的后端数据在通过Drive映射访问的服务器上。在我的情况下,Y驱动器。生产用户使用活动目录通过登录脚本获取映射。然后,批处理文件可以轻松完成以下方案:
在我的环境中(平均5个并发用户,1000行,而不是10,000个。)已经发生了腐败,但它很少见且易于管理。在过去的几年中,我们只使用了前几天的备份。我们使用SQL Server来实现更高容量的东西,但是开发起来并不方便,可能是因为我们没有现场的SQL管理员。
答案 4 :(得分:0)
您可能还会发现this question (how to extract schemas from access)的一些答案也很有用。一旦使用建议的技术之一提取了模式,就可以获得一系列新选项,例如在模式上使用源代码控制的能力,以及能够轻松构建“干净”的测试环境。
编辑以回复评论: 没有简单的方法来源控制Access数据库的原生格式,但架构文件只是像任何其他文本文件一样。因此,您可以在您选择的源控制软件中进行检查,以便轻松进行版本控制/回滚。
当然,它依赖于您设置一系列脚本来从架构重建数据库。一旦这样做,创建一个在不同位置重建它的选项/替代版本通常是相当简单的,允许您从任何以前提交的模式版本构建测试环境。我希望澄清一点!
答案 5 :(得分:0)
如果要在向客户端发布新FE时自动更新后端MDB架构,请参阅Compare'Em http://home.gci.net/~mike-noel/CompareEM-LITE/CompareEM.htm将很乐意生成需要重新创建MDB的VBA代码。或者用于创建两个MDB之间差异的代码,以便您可以对现有BE MDB进行版本升级。它有点古怪但有效。
我一直都在使用它。
答案 6 :(得分:-1)
您需要了解数据的共享mdb文件不是一个强大的解决方案。 Microsoft建议SQL Server或其他基于服务器的数据库将是一个更好的解决方案,并允许您使用相同的访问前端。如果您想这样做,迁移向导将帮助您进行转换。
另一种用途指出,腐败将会发生。这只是一个经常性的问题,而不是如果。
要了解性能问题,您需要了解服务器中包含数据的mdb文件就是一个文件。由于服务器上没有代码运行,服务器无法理解事务,记录锁定等。它只是知道有一群人正在尝试同时读写这些文件。
使用SQL Server,Oracle,DB2等数据库系统。 MySQL等数据库程序在服务器上运行,并像访问数据库文件的单个程序一样查看服务器。它是数据库程序(在服务器上运行),它处理记录锁定,事务,并发,日志记录,数据备份/恢复以及数据库中所需的所有其他好处。
由于设计为在服务器上运行的数据库程序是专门为此而设计的,因此它可以更好,更有效地执行Access等编写共享文件(mdb)的程序。
答案 7 :(得分:-2)
针对实时数据开发有两条规则
第一条规则是。 。 。永远不会发展 反对实时数据。永远不会。
第二条规则是。 。无论何时发展 反对实时数据。永远不会。
您可以以编程方式更改链接表的绑定,这样您就可以编写宏来在部署新版本时更改链接。
应用程序很慢,因为它是MS Access,并且它不像许多并发用户(其中许多是任何数字> 1)。