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:
- Det kan være mulig å behandle/kjøre 100 SOQL-spørringer i synkron Apex og 200 SOQL-spørringer i asynkron Apex.
- Bare 50 000 poster vil returnere fra en SOQL-spørring for både synkron og asynkron apex.
- Hvis vi bruker Database.getQueryLocator(), returneres bare 10 000 om gangen for både synkron og asynkron Apex.
- I begge scenariene er antallet SOSL-spørringer utstedt 20.
- 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.
- Maksimal CPU-tid som er tillatt for synkron Apex er 10 000 millisekunder og 60 000 millisekunder for asynkron Apex.
- Bare 10 minutter er tillatt for utførelse for begge Apex.
- I begge tilfeller kan vi bare bruke 10 sendEmail()-metoden med 100 mottakere.
- Tegnene som er til stede i Apex-klassen eller i Apex-utløseren må være innenfor 1 million.
- I Batch Apex (asynkron) er størrelsen 200. QueryLocator() i klassen 'Database' returnerer 50 millioner poster per transaksjon.
- 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.
- Limits.getDMLStatements() returnerer det totale antallet DML-setninger som brukes i en forekomst.
- Limits.getDMLRows() returnerer det totale antallet rader som returneres av DML-setningene.
- 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
//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.
ListProdukt2 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.