Salesforce Apex – Governor Limits

Salesforce Apex Governor Limits



Salesforce lar oss behandle eller utføre et bestemt antall utsagn/poster om gangen. Det er noen begrensninger for DML-setninger, Apex-klasser osv. å utføre eller behandle. Disse grensene er kjent som guvernørgrenser. I denne opplæringen vil vi se hva Governor-grensene er og hvordan de kan håndteres. Salesforce Apex tilbyr også 'Limit'-klassen for å vite grensene som er relatert til callouts, Apex-klasser, lynnettkomponenter, SOSL- og SOQL-setninger.

Guvernørens grenser

Tenk på et scenario der Alish og Subash er to personer som bruker Salesforce-organisasjonen. Alice ønsker å behandle eller utføre 1000 DML-setninger i én transaksjon. Parallelt ønsker Subash å laste inn 5000 poster om gangen. Hvis de gjør det parallelt, aksepterer ikke Salesforce og blir hektisk. Derfor kommer guvernørgrenser inn i bildet. I dette tilfellet kan Alish behandle 100 DML om gangen og Subash kan behandle 500 poster om gangen. De kan bruke AsynchronousBatch Apex til å gjøre hver transaksjon på en separat tråd uten å forstyrre hver av dem og fullføre oppgaven.







I utgangspunktet begrenser Governor-grenser i Salesforce behandlingen og utførelsen i flere transaksjoner. «Per-Transaction Apex Limits» teller for hver transaksjon og «Size-Specific Apex Limit» omhandler størrelsen på koden. Salesforce støtter to prosesser: synkrone og asynkrone prosesser. I den synkrone prosessen kjøres Apex-skriptet på én gang, mens i den asynkrone prosessen utføres Apex-skriptet ved å dele opp i flere jobber.



Tillatte grenser

La oss diskutere grenseantallet for forskjellige scenarier:



  1. Det kan være mulig å behandle/kjøre 100 SOQL-spørringer i synkron Apex og 200 SOQL-spørringer i asynkron Apex.
  2. Bare 50 000 poster vil returnere fra en SOQL-spørring for både synkron og asynkron apex.
  3. Hvis vi bruker Database.getQueryLocator(), returneres bare 10 000 om gangen for både synkron og asynkron Apex.
  4. I begge scenariene er antallet SOSL-spørringer utstedt 20.
  5. Heapstørrelsen som kreves for å behandle den synkrone Apex er 6 MB. For asynkron Apex er haugstørrelsen som kreves dobbel, noe som gjør den 12 MB.
  6. Maksimal CPU-tid som er tillatt for synkron Apex er 10 000 millisekunder og 60 000 millisekunder for asynkron Apex.
  7. Bare 10 minutter er tillatt for utførelse for begge Apex.
  8. I begge tilfeller kan vi bare bruke 10 sendEmail()-metoden med 100 mottakere.
  9. Tegnene som er til stede i Apex-klassen eller i Apex-utløseren må være innenfor 1 million.
  10. I Batch Apex (asynkron) er størrelsen 200. QueryLocator() i klassen 'Database' returnerer 50 millioner poster per transaksjon.
  11. Bare 5 Apex-jobber vil være i kø eller aktive.

LIMIT klasseeksempel:

Apex kan spesifisere Governor-grensene i 'LIMIT'-klassen. Denne klassen gir noen metoder som forteller guvernørens grenser. La oss se på følgende eksempel som viser noen guvernørgrenser:





System.debug('Antall samlede spørringer kan behandles: '+ Limits.getLimitAggregateQueries());

System.debug('Antall nettjenesteuttalelser kan behandles: '+ Limits.getLimitCallouts());

System.debug('Antall poster kan behandles: '+ Limits.getLimitDmlRows());

System.debug('Antall DML-setninger kan kalles: '+ Limits.getLimitDmlStatements());

System.debug('Total mengde minne i byte: '+ Limits.getLimitHeapSize());

System.debug('Antall SOQL-spørringer kan utstedes: '+ Limits.getLimitQueries());

System.debug('Antall poster kan utstedes: '+ Limits.getLimitQueryRows());

System.debug('Antall SOSL-spørringer kan utstedes:  '+ Limits.getLimitSoslQueries());

Produksjon:

Det kan også være mulig å sjekke hvor mange DML-setninger/rader som kan returneres ved å bruke «dome»-metodene som finnes i «LIMIT»-klassen.



  1. Limits.getDMLStatements() returnerer det totale antallet DML-setninger som brukes i en forekomst.
  2. Limits.getDMLRows() returnerer det totale antallet rader som returneres av DML-setningene.
  3. Limits.getCpuTime() returnerer CPU-brukt tid for gjeldende transaksjon i millisekunder.

Eksempel på bruk:

La oss skrive en SOQL-spørring som returnerer de to postene fra 'WorkOrder'-objektet. Etter det, slett disse to postene ved å bruke 'slett' DML.

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

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

System.debug('CPU-tid '+Limits.getCpuTime());

// SOQL-spørring for å velge 2 rader fra WorkOrder-objektet

List-kontoer = [VELG ID FRA WorkOrder LIMIT 2];

//Bruk delete DML for å slette to rader

slette kontoer;

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

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

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

System.debug('CPU-tid '+Limits.getCpuTime());

Produksjon:

I det gitte eksemplet er det ingen DML-setninger og 0 rader. Den eksisterende CPU-tiden er 1 millisekund. Etter å ha returnert 2 rader fra SOQL-spørringen og slettet disse to radene, er det totale antallet DML-setninger som returneres av Limits.getDMLStatements() 1, det totale antallet rader som returneres av Limits.getDMLRows() er 2, og CPU-en tiden som er nødvendig for å utføre denne transaksjonen er 51 millisekunder.

Eksempel på beste fremgangsmåte: «BRUKE ALDRI DML INN I SLØKKEN»

La oss se hvordan vi kan kjøre koden uten å få guvernørgrensen. Vi oppretter først en post på «Product»-objektet (API – Product2) fra  «WorkOrder»-objektet ved å tilordne «WorkOrder»-subjektet til «Product Name» i selve «for»-løkken. La oss se følgende kode:

Produkt2 prod_obj;

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

{

prod_obj = nytt produkt2(Navn = wo_objekt.Emne);

sett inn prod_obj;

}

Vi kan gjøre dette på en bedre måte ved å deklarere en liste (prod_s) og deretter lagre prod_obj i listen. Vi kan sette inn denne listen i produktet utenfor loopen.

List prod_s = new List();

Produkt2 prod_obj;

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

{

prod_obj = nytt produkt2(Navn = wo_objekt.Emne);

prod_s.add(prod_obj);

}

sett inn prod_obj;

Konklusjon

Vi har nå lært hva Apex-grensene er i Salesforce med en detaljert forklaring. Det er bedre å gå med Asynchronous Apex-prosessen for å få bedre Governor-grenser sammenlignet med Synchronous Apex. Vi lærte også om Governor-grensene for forskjellige scenarier og ga en prøvedemonstrasjon angående grensetelleren fra 'Limit'-klassen. Vi bekreftet også antallet DML-setninger, rader og CPU-tid ved å kjøre én DML-setning. Vi avsluttet denne veiledningen med å diskutere ett eksempel på beste praksis.