在构建ADO记录集时,是否将数据拉入内存? 我一直在研究一个相当大的C++项目,令人惊讶地使用MS Access 97作为它的底层数据库引擎。我注意到代码中有很多实例,其中记录集是从查询中创建的,这些查询可能返回远远超过100000条记录

在构建ADO记录集时,是否将数据拉入内存? 我一直在研究一个相当大的C++项目,令人惊讶地使用MS Access 97作为它的底层数据库引擎。我注意到代码中有很多实例,其中记录集是从查询中创建的,这些查询可能返回远远超过100000条记录,c++,ms-access,ado,C++,Ms Access,Ado,我很好奇,当您构建记录集时,ADO是否会将所有数据拉入内存,或者当您试图从记录集中读取数据时,ADO是否更智能,并且只能“及时”加载数据?我们收到了很多来自客户的性能投诉,这让我怀疑是有罪的 (迁移到更新的数据库引擎是我们的路线图。相信我,团队中没有人对Access感到满意)使用Access访问数据库时存在以下几个问题: 据推测,它支持255个并发用户,实际上是6个 20是最大数量,与数据库连接更少 规模/复杂性增加 对数据库大小和大小的2Gb限制 是的,数据缓存在本地,因此如果您有5000个结

我很好奇,当您构建记录集时,ADO是否会将所有数据拉入内存,或者当您试图从记录集中读取数据时,ADO是否更智能,并且只能“及时”加载数据?我们收到了很多来自客户的性能投诉,这让我怀疑是有罪的


(迁移到更新的数据库引擎是我们的路线图。相信我,团队中没有人对Access感到满意)

使用Access访问数据库时存在以下几个问题:

  • 据推测,它支持255个并发用户,实际上是6个 20是最大数量,与数据库连接更少 规模/复杂性增加
  • 对数据库大小和大小的2Gb限制
  • 是的,数据缓存在本地,因此如果您有5000个结果,那么 你只需要接受它们:)
  • 我很好奇,当您构建记录集时,ADO是否会将所有数据拉入内存,或者当您试图从记录集中读取数据时,ADO是否更智能,并且只能“及时”加载数据

    也许异步获取行可以改善用户的体验。请参阅中可与一起使用的选项。我怀疑这是你对“及时”的想法,但这是我能提供的最好的了


    在我看来,更好的设计是修改查询,只检索100K行的子集。然后,“及时”可以变成“让用户请求下一个子集”。而且,您应该能够从具有合理大小记录集的Access中获得良好的性能。

    不幸的是,我们对问题1和问题2(以及我们一些特别古怪的客户)的认识远远不够。但是#3是我个人不确定的地方,但有怀疑。团队迫切希望管理层批准重新编写我们的DB层!我感觉到你的痛苦!正是由于这些问题,现代实践是构造代码,使业务逻辑不知道数据源,只是从数据层检索数据。同意,不幸的是,这段代码始于1997年,当时Access97是一个新热点,在C++98定稿之前!此外,我们的数据层公开了许多关于ADO的实现细节(包括黑客),这非常可怕。很长一段时间以来,我一直渴望重写我们的整个数据层。感谢您的见解。获取子集正是我打算做的。我们正在尽快切换到另一个引擎,应该很清楚我们当前的数据层存在缺陷。我的目的是推动重写整个数据层,以便我们能够进行适当的“及时”检索。我在构建web应用程序方面有着更为丰富的历史,这就是我们如何在大型数据库上实现近乎即时的页面加载。目前,我们一直在清理现有层的问题,这让我想知道,在构建记录集时,ADO是否真的会在本地缓存数据。这不是主题,但我们的数据层似乎试图成为自己的数据库引擎,管理内存中的所有内容,而不是依赖实际的引擎来担心细节。我能理解为什么,因为底层存储在Access97中,但这仍然是一个糟糕的想法~^我不知道我们在这里是否有不同的目的。无论您选择哪个db引擎,您的应用程序都应该使用大小合理的记录集。如果这些庞大的记录集是导致客户性能投诉的原因,并且您希望尽快让客户满意,那么现在就解决记录集问题。不要等到切换db引擎并重写整个数据层时才开始。但首先要验证您的假设,即这些记录集是投诉的原因。复制数据库,转储大部分记录,看看会发生什么。我完全同意。然而,这个代码库超过C++的200万行,并且它的一个很好的块依赖于我们的数据层。更改数据层的底层实现将意味着大量的测试覆盖,这将花费我们的测试团队相当多的时间来完成。我们的预算中还没有这个。然而,它将“很快”到来,完全重写是可能的。这个问题太系统化了,无法纳入我们目前的预算。我正在向数据层添加一个新区域,因此请放心,新功能将正常工作。我将退出。:-)如果这项工作不是不合理的,请查看异步获取数据是否可以改善用户的体验。我仍然会验证性能问题是由这些记录集的大小引起的假设。。。这应该是容易测试的,不需要任何C++代码更改。