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時間

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