Apex CPU time limit exceeded

学习目的:
1,了解CPU time limit
2,怎么避免 CPU time limit exceeded

CPU time limit

salesforce是一个云租户平台,为了防止个别或者部分用户长期性或垄断性的占用资源,salesforce限定单个事务能够占用CPU的时长为10S(同步),60S(异步)。当然有一些时间是不计入这个时间统计的,比如说花在从数据库获取数据的时间,等待callout的响应时间等。在服务端的一个事务里面,如果DML操作引发了验证规则,那么执行验证规则的时间则会计入cpu执行时长,任何在这个事务里面code触发的processes所花费的时长都会被计入。例如package code and workflows。

那些情况会计入CPU花费时长:
All Apex code
Library functions exposed in Apex
Workflow execution

那些情况会计入CPU花费时长:
Database operations, e.g. DML, SOQL
SOSL
HTTP callouts

避免 CPU time limit exceeded

1,Using Map based query
List<Account> lstacc=[Select Id from Account limit 10000];

Set<Id> setIds=new Set<Id>();

for(Account a:lstacc){
 //More CPU time for sure due to looping
setIds.add(a.id);
}

//Using Map query saves CPU time

//Fetching all account in map
Map<id,account> aMap = **new Map<id,account>**([Select Id,Name from Account limit 50000]);

//Creating list of accounts
List<account> accList = aMap.values() ;

//Creating set of ids

Set<id> accIds = aMap.keySet() ;
2,从业务的角度出发,看看是否能把这块代码拆成异步的形式去执行。

@future:使用这个注释,使代码进行异步执行。CPU的时长会达60S。

3,把一些计算放到SOQL里面

因为soql的运行时间是不计入CPU的时长里面。所有可以使用一些聚合函数来代替在for循环里面计算。

4,只获取必要的数据并运行循环

在对记录列表执行for时,只过滤特定的数据是非常重要的,因为过多的循环会增加CPU时间

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章