Salesforce Apex – Governor Limits

Salesforce Apex Governor Limits



Salesforcen avulla voimme käsitellä tai suorittaa tietyn määrän lausuntoja/tietueita kerrallaan. DML-lauseiden, Apex-luokkien jne. suorittamiselle tai käsittelylle on joitain rajoituksia. Näitä rajoja kutsutaan kuvernöörirajoituksiksi. Tässä opetusohjelmassa näemme, mitä Governor-rajat ovat ja miten niitä voidaan käsitellä. Salesforce Apex tarjoaa myös 'Limit'-luokan, joka tietää rajat, jotka liittyvät huomioteksteihin, Apex-luokkiin, Lightning-verkkokomponentteihin, SOSL- ja SOQL-lauseisiin.

Kuvernöörin rajat

Harkitse tilannetta, jossa Alish ja Subash ovat kaksi henkilöä, jotka käyttävät Salesforce-organisaatiota. Alice haluaa käsitellä tai suorittaa 1000 DML-lausetta yhdessä tapahtumassa. Samanaikaisesti Subash haluaa ladata 5000 tietuetta kerrallaan. Jos he tekevät sen rinnakkain, Salesforce ei hyväksy ja muuttuu hektiseksi. Näin ollen kuvernöörin rajat tulevat kuvaan. Tässä tapauksessa Alish voi käsitellä 100 DML:ää kerrallaan ja Subash 500 tietuetta kerrallaan. He voivat käyttää AsynchronousBatch Apexia suorittaakseen jokaisen tapahtuman erillisessä säikeessä häiritsemättä niitä ja suorittaakseen tehtävänsä.







Pohjimmiltaan Salesforcen Governor-rajoitukset rajoittavat useiden tapahtumien käsittelyä ja suorittamista. 'Tapahtumakohtaiset Apex Limits' laskee jokaiselle tapahtumalle ja 'Kokokohtainen Apex Limit' koskee koodin kokoa. Salesforce tukee kahta prosessia: synkronisia ja asynkronisia prosesseja. Synkronisessa prosessissa Apex-skripti suoritetaan yhdellä kertaa, kun taas asynkronisessa prosessissa Apex-skripti suoritetaan jakamalla useisiin töihin.



Sallitut rajat

Keskustellaan eri skenaarioiden rajamäärästä:



  1. Voi olla mahdollista käsitellä/ajoa 100 SOQL-kyselyä synkronisessa Apexissa ja 200 SOQL-kyselyä asynkronisessa Apexissa.
  2. Vain 50 000 tietuetta palaa SOQL-kyselystä sekä synkroniselle että asynkroniselle kärjelle.
  3. Jos käytämme Database.getQueryLocator(), vain 10 000 palautetaan kerrallaan sekä synkroniselle että asynkroniselle Apexille.
  4. Molemmissa skenaarioissa lähetettyjen SOSL-kyselyjen määrä on 20.
  5. Synkronisen Apexin käsittelyyn vaadittava keon koko on 6 Mt. Asynkroniselle Apexille vaadittu kasan koko on kaksinkertainen, mikä tekee siitä 12 Mt.
  6. Synkroniselle Apexille sallittu suurin suoritinaika on 10 000 millisekuntia ja asynkroniselle Apexille 60 000 millisekuntia.
  7. Molempien apexien suorittamiseen on varattu vain 10 minuuttia.
  8. Molemmissa tapauksissa voimme käyttää vain 10 sendEmail() -menetelmää 100 vastaanottajan kanssa.
  9. Apex-luokassa tai Apex-triggerissä olevien merkkien on oltava miljoonan sisällä.
  10. Batch Apexissa (asynkroninen) koko on 200. 'Database'-luokan QueryLocator() palauttaa 50 miljoonaa tietuetta tapahtumaa kohden.
  11. Vain 5 Apex-työtä on jonossa tai aktiivisia.

LIMIT-luokan esimerkki:

Apex voi määrittää Governor-rajat 'LIMIT'-luokassa. Tämä luokka tarjoaa joitain menetelmiä, jotka kertovat Governorin rajat. Katsotaanpa seuraavaa esimerkkiä, joka näyttää joitakin Governor-rajoja:





System.debug('Käsiteltävissä olevien koontikyselyjen määrä: '+ Limits.getLimitAggregateQueries());

System.debug('Käsiteltävissä olevien verkkopalvelulausekkeiden määrä: '+ Limits.getLimitCallouts());

System.debug('Käsiteltävissä olevien tietueiden määrä: '+ Limits.getLimitDmlRows());

System.debug('DML-lauseiden määrä voidaan kutsua: '+ Limits.getLimitDmlStatements());

System.debug('Muistin kokonaismäärä tavuina: '+ Limits.getLimitHeapSize());

System.debug('SOQL-kyselyjen määrä voidaan antaa: '+ Limits.getLimitQueries());

System.debug('Tietueiden määrä voidaan antaa: '+ Limits.getLimitQueryRows());

System.debug('SOSL-kyselyjen määrä voidaan antaa:  '+ Limits.getLimitSoslQueries());

Lähtö:

Voidaan myös tarkistaa, kuinka monta DML-lausetta/riviä voidaan palauttaa käyttämällä 'dome'-metodeja, jotka ovat 'LIMIT'-luokassa.



  1. Limits.getDMLStatements() palauttaa ilmentymässä käytettyjen DML-lausekkeiden kokonaismäärän.
  2. Limits.getDMLRows() palauttaa DML-käskyjen palauttamien rivien kokonaismäärän.
  3. Limits.getCpuTime() palauttaa CPU:n käyttöajan nykyiselle tapahtumalle millisekunteina.

Käyttöesimerkki:

Kirjoitetaan SOQL-kysely, joka palauttaa kaksi tietuetta 'WorkOrder' -objektista. Poista tämän jälkeen nämä kaksi tietuetta käyttämällä 'delete' DML:ää.

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

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

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

// SOQL-kysely valitaksesi 2 riviä WorkOrder-objektista

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

//Poista kaksi riviä käyttämällä delete DML -toimintoa

poistaa tilejä;

System.debug('**SOQL:n jälkeen:**');

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

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

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

Lähtö:

Annetussa esimerkissä ei ole DML-lauseita ja 0 riviä. Nykyinen CPU-aika on 1 millisekunti. Kun SOQL-kyselystä on palautettu 2 riviä ja nämä kaksi riviä on poistettu, Limits.getDMLStatements()-funktion palauttamien DML-lauseiden kokonaismäärä on 1, Limits.getDMLRows() -funktion palauttamien rivien kokonaismäärä on 2 ja suoritin. tämän tapahtuman suorittamiseen tarvittava aika on 51 millisekuntia.

Esimerkki parhaista käytännöistä: ”ÄLÄ KOSKAAN KÄYTÄ DML:ää SILMUKAN SISÄLLÄ”

Katsotaanpa, kuinka voimme suorittaa koodin ilman kuvernöörirajaa. Luomme ensin tietueen 'Tuote'-objektille (API – Tuote2) 'WorkOrder'-objektista määrittämällä 'WorkOrder'-aiheen 'Product Name' -silmukan 'Product Name' -kohtaan. Katsotaanpa seuraava koodi:

Product2 prod_obj;

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

{

prod_obj = uusi Tuote2(Nimi = wo_objekti.Aihe);

lisää prod_obj;

}

Voimme tehdä tämän paremmin ilmoittamalla listan (prod_s) ja tallentamalla sitten prod_obj luetteloon. Voimme lisätä tämän luettelon tuotteeseen silmukan ulkopuolelle.

Lista tuote_s = uusi Lista();

Product2 prod_obj;

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

{

prod_obj = uusi Tuote2(Nimi = wo_objekti.Aihe);

prod_s.add(tuote_obj);

}

lisää prod_obj;

Johtopäätös

Olemme nyt oppineet, mitkä Apex-rajat ovat Salesforcessa yksityiskohtaisella selityksellä. On parempi käyttää Asynchronous Apex -prosessia saadaksesi paremmat Governor-rajat verrattuna Synchronous Apexiin. Opimme myös Governor-rajoista eri skenaarioissa ja esitimme malliesityksen rajalaskennasta ”Limit”-luokasta. Vahvistimme myös DML-lauseiden, rivien ja suoritinajan määrän suorittamalla yhden DML-käskyn. Päätimme tämän oppaan keskustelemalla yhdestä parhaiden käytäntöjen esimerkistä.