0

我有一个批处理 apex 类,我在其中构建网站和电子邮件的集合,以便我可以使用这些集合来过滤将被制成集合的其他查询。设置完所有集合后,我想通过范围的最后一个循环来执行业务流程。

小样:

for(Object o : scope)
{
listEmails.add(o.Email);
listWebsites.add(o.Websites);
}

Map<String, Account> accounts = Gather all accounts where website not in :listWebsties; //Website is key
List<String, Contact> contacts = Gather all contacts where email not in :listEmails; //Email is key

for(Object o : scope)
{
   Account = accounts.get(o.website);
   Contact = contacts.get(o.Email);

   Perform business logic here
}

问题是当我运行这个批处理时,它会持续处理几个小时。当使用一个相当小的数据库时,这工作得很好。但是在更大的环境中工作,也许这不是最好的解决方案。

谁能帮助我用更有效的方法加快批处理过程?

4

1 回答 1

0

无论如何要发布整个批处理顶点课程吗?或者帮助更多地了解数据?从您的地图上看,您的所有帐户(理论上)都有独特的网站,并且您的所有联系人都有独特的电子邮件?我假设您手动构建这些地图?那就是您遍历帐户并执行 map.put(account.website,account)?

您是否有任何系统调试语句来确认您的地图大小?如果调用accounts.get() 时没有帐户或没有联系人会发生什么?

以及业务逻辑——它是否更循环?

您是否以静态方式使用批处理变量 - 即您可以有一个计数器来计算处理的记录总数。如果是这样,您的变量是列表吗?这当然是危险的。

还有什么对象是你的范围对象?这并不重要,但我认为您希望您的范围是帐户本身或联系人本身。

我会尝试将 system.debug 语句添加到您的批处理中以验证它是否正在运行并查看无限循环可能发生的位置。

于 2012-05-16T15:00:52.080 回答