學習目的:
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時間