Salesforce Apex – limity guvernéra

Salesforce Apex Limity Guvernera



Salesforce nám umožňuje spracovať alebo vykonať určitý počet výpisov/záznamov naraz. Existujú určité obmedzenia pre príkazy DML, triedy Apex atď., ktoré sa majú vykonať alebo spracovať. Tieto limity sú známe ako limity guvernérov. V tomto návode uvidíme, aké sú limity guvernéra a ako sa s nimi dá zaobchádzať. Salesforce Apex tiež poskytuje triedu „Limit“, aby ste poznali limity súvisiace s popismi, triedami Apex, bleskovými webovými komponentmi, príkazmi SOSL a SOQL.

Governor Limits

Zvážte scenár, v ktorom sú Alish a Subash dve osoby používajúce organizáciu Salesforce. Alice chce spracovať alebo vykonať 1 000 výpisov DML v jednej transakcii. Paralelne chce Subash načítať 5000 záznamov naraz. Ak to urobia súbežne, Salesforce to neprijme a stane sa hektickým. Preto sa dostávajú do obrazu limity guvernérov. V tomto prípade môže Alish spracovať 100 DML naraz a Subash dokáže spracovať 500 záznamov naraz. Môžu použiť AsynchronousBatch Apex na vykonanie každej transakcie v samostatnom vlákne bez toho, aby každého z nich vyrušili a dokončili svoju úlohu.







V zásade limity guvernéra v Salesforce obmedzujú spracovanie a vykonávanie vo viacerých transakciách. „Limity vrcholu transakcie“ sa počítajú pre každú transakciu a „Limit vrcholu špecifického pre veľkosť“ sa týka veľkosti kódu. Salesforce podporuje dva procesy: synchrónne a asynchrónne procesy. V synchrónnom procese sa skript Apex vykoná jedným pohybom, zatiaľ čo v asynchrónnom procese sa skript Apex vykoná rozdelením do viacerých úloh.



Povolené limity

Poďme diskutovať o počte limitov pre rôzne scenáre:



  1. Je možné spracovať/spustiť 100 SOQL dotazov v synchrónnom Apexe a 200 SOQL dotazov v asynchrónnom Apexe.
  2. Z dotazu SOQL sa vráti iba 50 000 záznamov pre synchrónny aj asynchrónny vrchol.
  3. Ak použijeme Database.getQueryLocator(), naraz sa vráti iba 10 000 pre synchrónny aj asynchrónny Apex.
  4. V oboch scenároch je počet vydaných dotazov SOSL 20.
  5. Veľkosť haldy, ktorá je potrebná na spracovanie synchrónneho Apexu, je 6 MB. Pre asynchrónny Apex je požadovaná veľkosť haldy dvojnásobná, čo znamená 12 MB.
  6. Maximálny čas CPU, ktorý je povolený pre synchrónny Apex, je 10 000 milisekúnd a 60 000 milisekúnd pre asynchrónny Apex.
  7. Na vykonanie oboch Apexov je povolených iba 10 minút.
  8. V oboch prípadoch môžeme použiť iba metódu 10 sendEmail() so 100 príjemcami.
  9. Znaky, ktoré sú prítomné v triede Apex alebo v spúšťači Apex, musia byť v rozmedzí 1 milióna.
  10. V Batch Apex (asynchrónne) je veľkosť 200. QueryLocator() triedy “Database” vracia 50 miliónov záznamov na transakciu.
  11. Iba 5 úloh Apex bude vo fronte alebo bude aktívnych.

Príklad triedy LIMIT:

Apex môže špecifikovať limity guvernéra v triede „LIMIT“. Táto trieda poskytuje niekoľko metód, ktoré informujú o limitoch guvernéra. Pozrime sa na nasledujúci príklad, ktorý zobrazuje niektoré limity guvernéra:





System.debug('Počet súhrnných dopytov, ktoré možno spracovať: '+ Limits.getLimitAggregateQueries());

System.debug('Počet príkazov webovej služby, ktoré možno spracovať: '+ Limits.getLimitCallouts());

System.debug('Počet záznamov, ktoré je možné spracovať: '+ Limits.getLimitDmlRows());

System.debug('Počet DML príkazov možno volať: '+ Limits.getLimitDmlStatements());

System.debug('Celkové množstvo pamäte v bajtoch: '+ Limits.getLimitHeapSize());

System.debug('Môže byť zadaný počet SOQL dotazov: '+ Limits.getLimitQueries());

System.debug('Môže byť vystavený počet záznamov: '+ Limits.getLimitQueryRows());

System.debug('Je možné zadať počet SOSL dotazov:  '+ Limits.getLimitSoslQueries());

Výkon:

Je tiež možné skontrolovať, koľko príkazov/riadkov DML je možné vrátiť pomocou „dome“ metód, ktoré sú prítomné v triede „LIMIT“.



  1. Limits.getDMLStatements() vráti celkový počet príkazov DML, ktoré sa používajú v inštancii.
  2. Limits.getDMLRows() vráti celkový počet riadkov, ktoré vrátia príkazy DML.
  3. Limits.getCpuTime() vráti čas využitý CPU pre aktuálnu transakciu v milisekundách.

Príklad použitia:

Napíšme dotaz SOQL, ktorý vráti dva záznamy z objektu „WorkOrder“. Potom odstráňte tieto dva záznamy pomocou „delete“ DML.

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

System.debug('Rádky: '+Limits.getDmlRows());

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

// SOQL Dotaz na výber 2 riadkov z objektu WorkOrder

Zoznam účty = [SELECT Id FROM WorkOrder LIMIT 2];

//Použite delete DML na odstránenie dvoch riadkov

odstrániť účty;

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

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

System.debug('Rádky: '+Limits.getDmlRows());

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

Výkon:

V uvedenom príklade neexistujú žiadne príkazy DML a 0 riadkov. Existujúci čas procesora je 1 milisekunda. Po vrátení 2 riadkov z dotazu SOQL a odstránení týchto dvoch riadkov je celkový počet príkazov DML vrátených funkciou Limits.getDMLStatements() 1, celkový počet riadkov vrátených funkciou Limits.getDMLRows()  je 2 a CPU čas potrebný na vykonanie tejto transakcie je 51 milisekúnd.

Príklad osvedčeného postupu:  „NIKDY NEPOUŽÍVAJTE DML V SLUČKE“

Pozrime sa, ako môžeme spustiť kód bez toho, aby sme získali limit guvernéra. Najprv vytvoríme záznam o objekte „Produkt“ (API – Product2) z  objektu „WorkOrder“ priradením „WorkOrder“ pod „Názov produktu“ v samotnej slučke „for“. Pozrime sa na nasledujúci kód:

Produkt2 prod_obj;

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

{

prod_obj = novy Produkt2(Nazov = wo_objekt.Predmet);

vložiť prod_obj;

}

Môžeme to urobiť lepším spôsobom deklarovaním zoznamu (prod_s) a uložením prod_obj do zoznamu. Tento zoznam môžeme vložiť do produktu mimo slučky.

Zoznam prod_s = new Zoznam();

Produkt2 prod_obj;

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

{

prod_obj = novy Produkt2(Nazov = wo_objekt.Predmet);

prod_s.add(prod_obj);

}

vložiť prod_obj;

Záver

Teraz sme sa dozvedeli, aké sú limity Apex v Salesforce s podrobným vysvetlením. Je lepšie ísť s procesom Asynchrónny Apex, aby ste získali lepšie limity guvernéra v porovnaní so Synchrónnym Apexom. Dozvedeli sme sa tiež o limitoch guvernéra pre rôzne scenáre a poskytli sme ukážku týkajúcu sa počtu limitov z triedy „Limit“. Tiež sme overili počet DML príkazov, riadkov a CPU čas spustením jedného DML príkazu. Túto príručku sme uzavreli diskusiou o jednom príklade osvedčených postupov.