Loading

Utilizza il codice in modo più efficiente per evitare di superare il limite di tempo CPU Apex

Data pubblicazione: Aug 19, 2020
Descrizione
In Salesforce è attivo un limite di timeout per le transazioni in base all'utilizzo della CPU. Se una transazione consuma troppo tempo CPU, viene chiusa in quanto transazione di lunga durata.
Risoluzione

Vengono conteggiati solo gli eventi che richiedono l'utilizzo della CPU del server di applicazioni. Alcuni elementi che usano la CPU del server di applicazioni non vengono conteggiati. Si tratta di elementi al di fuori del controllo del programmatore. Non viene conteggiato, ad esempio, il tempo impiegato nel recupero di record dal database, né il tempo di attesa del ritorno di una chiamata. Il programmatore non ha il controllo sul momento in cui il codice necessita della compilazione, quindi questo tempo non viene conteggiato.
 

Vengono conteggiate quasi tutte le altre operazioni che vengono eseguite nel server di applicazioni, comprese le azioni dichiarative. Se DML nel codice incontra una regola di convalida con una formula, viene conteggiato il tempo impiegato nella valutazione della formula. Il tempo CPU viene calcolato per tutte le esecuzioni sui server di applicazioni Salesforce che si verificano in un'unica transazione Apex, per l'esecuzione di Apex Code e per qualsiasi processo chiamato da tale codice, ad esempio codice del pacchetto e flussi di lavoro. Il tempo CPU di una transazione è privato e isolato dalle altre transazioni. Le operazioni che non utilizzano tempo CPU del server di applicazioni non vengono conteggiate per il tempo CPU.
 

Elementi conteggiati

  • Tutto l'Apex code
  • Funzioni di libreria esposte in Apex
  • Esecuzione di flussi di lavoro

Elementi non conteggiati

  • Operazioni di database. Ad esempio, la parte del tempo di esecuzione impiegata nel database per DML, SOQL e SOSL non viene conteggiata, così come il tempo di attesa per le chiamate Apex o per SOQL

Procedure ottimali per evitare l'esaurimento del tempo CPU

Per facilitare la riduzione dei casi di esaurimento del tempo CPU, è possibile fare riferimento ad Apex Code Best Practices (Procedure ottimali per Apex Code). Di seguito sono illustrati alcuni dei suggerimenti. 

Utilizzo di query basate su Map

List<Account> lstacc=[Select Id from Account limit 10000]; Set<Id> setIds=new Set<Id>(); for(Account a:lstacc){ //Sicuramente più tempo CPU dovuto al loop setIds.add(a.id); } //La query Map consente di risparmiare tempo CPU //Recupero di tutti gli account in Map Map<id,account> aMap = new Map<id,account>([Select Id,Name from Account limit 50000]); //Creazione di un elenco di account List<account> accList = aMap.values() ; //Creazione di set di ID Set<id> accIds = aMap.keySet() ;

Considerare se il business consente l'esecuzione asincrona dell'operazione

In alcuni casi, i processi aziendali possono non essere eseguiti in tempo reale. Pertanto, se esiste la possibilità di eseguire codice in @future, il contesto viene interrotto. Inoltre, il limite di tempo CPU dei processi asincroni è 60 secondi (6 volte quello dei processi sincroni). Si tenga quindi presente questa possibilità se sussiste il problema del raggiungimento del limite.

Utilizzo di SOQL aggregato

Dato che il tempo database non viene conteggiato nel tempo CPU, è sempre meglio prendere in considerazione l'utilizzo di SOQL aggregato per i casi d'uso del proprio business.

Si supponga di voler sommare il valore di alcuni campi di alcuni record. Se a tale scopo si utilizza un loop FOR normale, è ovvio che si impiega tempo CPU. Provare invece a eseguire il calcolo mediante le funzioni aggregate SUM, AVG a livello del database stesso. In questo modo, il tempo CPU viene ridotto. Esaminare le opzioni di raggruppamento o di creazione di un qualche tipo di filtro a livello di database ed eseguire i calcoli a questo livello per ridurre la probabilità di dover affrontare il problema dell'esaurimento del tempo CPU.

Prendere solo i dati necessari ed eseguire un loop

È essenziale che un loop FOR su un elenco di record filtri solo dati specifici, poiché un loop eccessivamente lungo aumenta il tempo CPU. Lo stesso vale quando c'è un limite al numero di istruzioni di uno script.

Nota: attualmente esiste un problema noto delle operazioni di inserimento DML che riguarda la CPU Apex nel caso di un numero elevato di record con un numero eccessivo di colonne. 

Numero articolo Knowledge

000387833

 
Caricamento
Salesforce Help | Article