最近我遇到了一个问题,我导入到应用程序中的数据没有得到更新,尽管我确信我的流程已经完全按照预期构建。
首先,我来介绍一下这个问题的背景。正如我所说,我正在将记录导入我的应用程序,假设有大约 10,000 条记录,然后我想更新这些记录并将其标记为“已处理”。
因此,我使用 Web 服务构建了导入,数据导入没有问题。然后,我构建了一个使用一次 1,000 条记录的限制的流程并更新它们。使用限制的检索允许您处理表中的数据子集,从而确保您不会将太多记录放入内存中并可能影响应用程序的性能。
此外,我还使用了偏移量;偏移量允许您指定要在表中的哪个位置开始检索。一旦您将其落实到位,您就可以迭代您的流程,增加您的限制,以确保您处理所有记录。如下所示:


因此,对上图的基本解释是:
- 创建一个整数,等于您想要“限制”检索的记录数(在本例中为 1,000)
- 创建一个等于偏移量的整数。对于此示例,我需要从 0 开始,这当然是第一条记录。
- 使用自定义检索来检索您的实体列表。
- 将您的限制定义为 $Limit
- 将您的偏移量定义为 $Offset

- 遍历您的列表并执行您想要的任何流程
- 计算在检索操作中检索到的实体数量
- 检查检索到的实体数量是否等于您定义的限制
- 如果是的话(正确),那么再做一次,可能会有更多
- 如果没有(假),那么你一定已经到达了列表的末尾
很简单吧?不幸的是,我错过了最重要的一点,即在检索过程中加入排序。
让我解释一下为什么这很重要。下面您将看到检索上述微流程中定义的“小方块”的结果:

假设上面的图片是一张有 100 个小方块的表格。我检索的限制是 10,偏移量为 0。突出显示的方块是被检索和处理的。此过程完成后,我们将偏移量更改为上一次检索的数字(10),然后在数据库上进行另一次检索。
现在我的记录集已检索,但由于我没有定义排序顺序,因此检索会任意返回无特定顺序的列表。由于我的偏移量为 10,因此我从记录 10 开始,不幸的是,它可能是已经处理过的记录。下图显示了第二个检索到的列表,突出显示的记录是我们将要处理的记录:

现在,下图显示了应用排序后的检索。在应用排序时,我们希望确保使用尽可能最独特的属性。这将帮助我们确保检索到的列表始终相同,并且我们一定会处理表中的每个记录。

现在,有时实施偏移并不明智。让我们想象一下这个例子;小方块要么是白色(未处理),要么是蓝色(已处理)。我想检索所有未处理的记录并处理它们。在我的检索操作中,我应用了 [Processed = false()] 的 XPath 约束。

同样,我有一张包含 100 条记录的表,如下图所示,所有这些记录都尚未处理。我使用限制 10 和偏移量 0,这样我就可以获取前十条记录。然后我将处理每一条记录:

我已经处理了 10 条记录,现在我的数据集如下图所示。如果我应用修改后的偏移量但继续使用 XPath 约束,我的进程将跳过结果数据集的前 XNUMX 条记录,从而仅导致部分更新。

根据我的经验,本文提供的示例是限制和偏移检索和处理的最常见示例。还有其他情况,可能会或可能不会根据属性值或其他原因处理数据。始终确保使用一种排序方式,以使列表尽可能静态:

总而言之,在处理大型数据集的检索时,您应该:
- 使用限制和偏移
- 限制应设置为不超过 3,000,以尽量减少对缓存和系统性能的影响
- 如果检索约束不会导致记录集发生更改,则应使用偏移量。它也应该是一个变量,并设置为列表中您想要开始处理的位置。
- 对最独特的属性进行排序,使检索在迭代过程中保持静态
与您在 Mendix,请始终小心考虑您在其中做出的选择和操作会如何影响您的数据。我希望前面的帖子能对这个主题有所启发,并祝大家建模愉快!