当任何相关记录发生更改、添加或删除时,我的应用程序有许多需要更新的聚合字段。关系和计算有些涉及,所以我创建了一个类来处理所有相关表的所有计算。计算中涉及一些 SOQL 和 DML 开销,因此该类批量处理所有内容。
我希望此类上的 updateAll() 方法对已添加到其队列的所有记录的每个请求运行不超过一次。但是,APEX 中似乎没有“类似解构器”的功能会在此计算器对象被销毁之前自动被调用。
在 APEX 中实现此模式的最佳方法是什么?
当任何相关记录发生更改、添加或删除时,我的应用程序有许多需要更新的聚合字段。关系和计算有些涉及,所以我创建了一个类来处理所有相关表的所有计算。计算中涉及一些 SOQL 和 DML 开销,因此该类批量处理所有内容。
我希望此类上的 updateAll() 方法对已添加到其队列的所有记录的每个请求运行不超过一次。但是,APEX 中似乎没有“类似解构器”的功能会在此计算器对象被销毁之前自动被调用。
在 APEX 中实现此模式的最佳方法是什么?
是的,没有办法检测或预测对象的破坏,因为它本质上是后台的 JSP(嘘,他们不想让你知道,这是“没有软件”的东西;)他们可能遵循它的生命周期机制,但你可以不要依赖那个。
我们实际上在触发器或报告中处理我们的聚合(取决于是否需要存储聚合)。触发器还以列表的形式接收批次,而不是一个接一个的行,这允许批次聚合并允许我们满足讨厌的调控器。不幸的是,如果您有多表聚合,则需要为所有它们设置触发器并为每个批次重新运行它们
这就是我所做的。我创建了一个 Calculator 类,它重新计算约 10 个表/对象关系中的每个相关聚合/计算字段。我在每个对象上都使用了触发器,以使计算器类在与已更改对象相关的对象族集上运行。我在计算器类上使用了一个静态变量来检查计算器是否在每个触发器中运行,以便它们仅在当前未运行时才调用计算器。它工作得很好。有点低效,但保持在州长限制之下,并且批量工作非常好。而且,我可以和它一起成长……