Salesforce Apex - Limiti del governatore

Salesforce Apex Limiti Del Governatore



Salesforce ci consente di elaborare o eseguire un determinato numero di dichiarazioni/record alla volta. Esistono alcuni limiti per l'esecuzione o l'elaborazione di istruzioni DML, classi Apex e così via. Questi limiti sono noti come limiti del governatore. In questo tutorial vedremo quali sono i limiti di Governor e come possono essere gestiti. Inoltre, Salesforce Apex fornisce la classe 'Limit' per conoscere i limiti relativi a callout, classi Apex, componenti Web Lightning, istruzioni SOSL e SOQL.

Limiti del governatore

Considera uno scenario in cui Alish e Subash sono due persone che utilizzano l'organizzazione Salesforce. Alice desidera elaborare o eseguire 1000 istruzioni DML in un'unica transazione. Parallelamente, Subash vuole caricare 5000 record alla volta. Se lo fanno in parallelo, Salesforce non accetterà e diventerà frenetico. Quindi, entrano in gioco i limiti del governatore. In questo caso, Alish può elaborare 100 DML alla volta e Subash può elaborare 500 record alla volta. Possono utilizzare AsynchronousBatch Apex per eseguire ogni transazione su un thread separato senza disturbare ciascuno di loro e completare la loro attività.







Fondamentalmente, i limiti del governatore in Salesforce limitano l'elaborazione e l'esecuzione in più transazioni. I 'limiti Apex per transazione' contano per ogni transazione e il 'limite Apex specifico per le dimensioni' riguarda le dimensioni del codice. Salesforce supporta due processi: processi sincroni e asincroni. Nel processo sincrono, lo script Apex viene eseguito in un'unica operazione, mentre nel processo asincrono lo script Apex viene eseguito suddividendolo in più processi.



Limiti consentiti

Discutiamo il conteggio limite per diversi scenari:



  1. È possibile elaborare/eseguire 100 query SOQL in Apex sincrono e 200 query SOQL in Apex asincrono.
  2. Solo 50.000 record restituiranno da una query SOQL sia per l'apice sincrono che per quello asincrono.
  3. Se utilizziamo Database.getQueryLocator(), ne vengono restituiti solo 10.000 alla volta sia per l'Apex sincrono che per quello asincrono.
  4. In entrambi gli scenari, il numero di query SOSL emesse è 20.
  5. La dimensione dell'heap necessaria per elaborare l'Apex sincrono è di 6 MB. Per Apex asincrono, la dimensione dell'heap richiesta è doppia, ovvero 12 MB.
  6. Il tempo massimo della CPU consentito per Apex sincrono è 10.000 millisecondi e 60.000 millisecondi per Apex asincrono.
  7. Sono concessi solo 10 minuti per l'esecuzione per entrambi gli Apex.
  8. In entrambi i casi, possiamo utilizzare solo 10 metodi sendEmail() con 100 destinatari.
  9. I caratteri presenti nella classe Apex o nel trigger Apex devono essere entro 1 milione.
  10. In Batch Apex (asincrono), la dimensione è 200. QueryLocator() della classe 'Database' restituisce 50 milioni di record per transazione.
  11. Solo 5 lavori Apex saranno in coda o attivi.

Esempio di classe LIMIT:

Apex può specificare i limiti del Governatore nella classe 'LIMIT'. Questa classe fornisce alcuni metodi che indicano i limiti di Governor. Diamo un'occhiata al seguente esempio che mostra alcuni limiti del governatore:





System.debug('Numero di query aggregate che possono essere elaborate: '+ Limits.getLimitAggregateQueries());

System.debug('Numero di istruzioni del servizio Web che possono essere elaborate: '+ Limits.getLimitCallouts());

System.debug('Numero di record che possono essere elaborati: '+ Limits.getLimitDmlRows());

System.debug('Numero di istruzioni DML che possono essere chiamate: '+ Limits.getLimitDmlStatements());

System.debug('Quantità totale di memoria in byte: '+ Limits.getLimitHeapSize());

System.debug('Numero di query SOQL che possono essere emesse: '+ Limits.getLimitQueries());

System.debug('Numero di record che possono essere emessi: '+ Limits.getLimitQueryRows());

System.debug('Numero di query SOSL che possono essere emesse:  '+ Limits.getLimitSoslQueries());

Produzione:

È inoltre possibile verificare quante istruzioni/righe DML possono essere restituite utilizzando i metodi “dome” presenti nella classe “LIMIT”.



  1. Limits.getDMLStements() restituisce le istruzioni DML totali utilizzate in un'istanza.
  2. Limits.getDMLRows() restituisce il numero totale di righe restituite dalle istruzioni DML.
  3. Limits.getCpuTime() restituisce il tempo utilizzato dalla CPU per la transazione corrente in millisecondi.

Esempio di utilizzo:

Scriviamo una query SOQL che restituisca i due record dall'oggetto 'WorkOrder'. Successivamente, elimina questi due record utilizzando 'elimina' DML.

System.debug('DML Statements:'+Limits.getDMLStatements());

System.debug('Rows: '+Limits.getDmlRows());

System.debug('CPU Time '+Limits.getCpuTime());

// SOQL Query per selezionare 2 righe dall'oggetto WorkOrder

List account = [SELECT Id FROM WorkOrder LIMIT 2];

//Utilizzare delete DML per eliminare due righe

eliminare gli account;

System.debug('**Dopo SOQL:**');

System.debug('DML Statements:'+Limits.getDMLStatements());

System.debug('Rows: '+Limits.getDmlRows());

System.debug('CPU Time '+Limits.getCpuTime());

Produzione:

Nell'esempio fornito, non ci sono istruzioni DML e 0 righe. Il tempo CPU esistente è di 1 millisecondo. Dopo aver restituito 2 righe dalla query SOQL ed aver eliminato queste due righe, il numero totale di istruzioni DML restituite da Limits.getDMLStatements() è 1, le righe totali restituite da Limits.getDMLRows()  sono 2 e la CPU il tempo necessario per eseguire questa transazione è di 51 millisecondi.

Esempio di best practice: 'MAI USARE DML ALL'INTERNO DEL LOOP'

Vediamo come possiamo eseguire il codice senza ottenere il limite del governatore. Per prima cosa creiamo un record sull'oggetto 'Prodotto' (API - Product2) dall'oggetto 'WorkOrder' assegnando l'oggetto 'WorkOrder' al 'Nome prodotto' nel ciclo 'for' stesso. Vediamo il seguente codice:

Prodotto2 prod_obj;

for (WorkOrder wo_object : [SELECT Subject FROM WorkOrder])

{

prod_obj = new Product2(Nome = wo_object.Subject);

inserire prod_obj;

}

Possiamo farlo in modo migliore dichiarando una lista (prod_s) e quindi memorizzando prod_obj nella lista. Possiamo inserire questa lista nel prodotto fuori dal ciclo.

Lista prod_s = new Lista();

Prodotto2 prod_obj;

for (WorkOrder wo_object : [SELECT Subject FROM WorkOrder])

{

prod_obj = new Product2(Nome = wo_object.Subject);

prod_s.add(prod_obj);

}

inserire prod_obj;

Conclusione

Ora abbiamo appreso quali sono i limiti Apex in Salesforce con una spiegazione dettagliata. È preferibile utilizzare il processo Asynchronous Apex per ottenere limiti di Governor migliori rispetto a Synchronous Apex. Abbiamo anche appreso i limiti del Governatore per diversi scenari e fornito una dimostrazione di esempio relativa al conteggio dei limiti dalla classe 'Limite'. Abbiamo anche verificato il conteggio delle istruzioni DML, delle righe e del tempo della CPU eseguendo un'istruzione DML. Abbiamo concluso questa guida discutendo un esempio di best practice.