限制和偏移 | Mendix

跳到主要内容

限制和偏移

最近我遇到了一个问题,我导入到应用程序中的数据没有得到更新,尽管我确信我的流程已经完全按照预期构建。

首先,我来介绍一下这个问题的背景。正如我所说,我正在将记录导入我的应用程序,假设有大约 10,000 条记录,然后我想更新这些记录并将其标记为“已处理”。

因此,我使用 Web 服务构建了导入,数据导入没有问题。然后,我构建了一个使用一次 1,000 条记录的限制的流程并更新它们。使用限制的检索允许您处理表中的数据子集,从而确保您不会将太多记录放入内存中并可能影响应用程序的性能。

此外,我还使用了偏移量;偏移量允许您指定要在表中的哪个位置开始检索。一旦您将其落实到位,您就可以迭代您的流程,增加您的限制,以确保您处理所有记录。如下所示:

微流程示例

数据图

因此,对上图的基本解释是:

  • 创建一个整数,等于您想要“限制”检索的记录数(在本例中为 1,000)
  • 创建一个等于偏移量的整数。对于此示例,我需要从 0 开始,这当然是第一条记录。
  • 使用自定义检索来检索您的实体列表。
    • 将您的限制定义为 $Limit
    • 将您的偏移量定义为 $Offset定义限制截图
  • 遍历您的列表并执行您想要的任何流程
  • 计算在检索操作中检索到的实体数量
  • 检查检索到的实体数量是否等于您定义的限制
    • 如果是的话(正确),那么再做一次,可能会有更多
    • 如果没有(假),那么你一定已经到达了列表的末尾

很简单吧?不幸的是,我错过了最重要的一点,即在检索过程中加入排序。

让我解释一下为什么这很重要。下面您将看到检索上述微流程中定义的“小方块”的结果:

数据图

假设上面的图片是一张有 100 个小方块的表格。我检索的限制是 10,偏移量为 0。突出显示的方块是被检索和处理的。此过程完成后,我们将偏移量更改为上一次检索的数字(10),然后在数据库上进行另一次检索。

现在我的记录集已检索,但由于我没有定义排序顺序,因此检索会任意返回无特定顺序的列表。由于我的偏移量为 10,因此我从记录 10 开始,不幸的是,它可能是已经处理过的记录。下图显示了第二个检索到的列表,突出显示的记录是我们将要处理的记录:

数据图

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

数据图

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

已处理等于 false

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

数据图

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

数据图

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

限制和偏移10

总而言之,在处理大型数据集的检索时,您应该:

  • 使用限制和偏移
    • 限制应设置为不超过 3,000,以尽量减少对缓存和系统性能的影响
    • 如果检索约束不会导致记录集发生更改,则应使用偏移量。它也应该是一个变量,并设置为列表中您想要开始处理的位置。
  • 对最独特的属性进行排序,使检索在迭代过程中保持静态

与您在 Mendix,请始终小心考虑您在其中做出的选择和操作会如何影响您的数据。我希望前面的帖子能对这个主题有所启发,并祝大家建模愉快!

选择你的语言