Salesforce Apex – Limity guvernéra

Salesforce Apex Limity Guvernera



Salesforce nám umožňuje zpracovávat nebo provádět určitý počet výpisů/záznamů najednou. Existují určitá omezení pro provádění nebo zpracování příkazů DML, tříd Apex atd. Tyto limity jsou známé jako limity guvernérů. V tomto tutoriálu uvidíme, jaké jsou limity guvernéra a jak se s nimi dá zacházet. Salesforce Apex také poskytuje třídu „Limit“, abyste poznali limity související s popisky, třídami Apex, webovými komponentami lightning, příkazy SOSL a SOQL.

Limity guvernéra

Zvažte scénář, kde Alish a Subash jsou dvě osoby používající organizaci Salesforce. Alice chce zpracovat nebo provést 1 000 výpisů DML v jedné transakci. Paralelně chce Subash načíst 5000 záznamů najednou. Pokud to dělají souběžně, Salesforce to nepřijme a stane se hektickým. Na scénu tak přicházejí guvernérské limity. V tomto případě může Alish zpracovat 100 DML najednou a Subash může zpracovat 500 záznamů najednou. Mohou použít AsynchronousBatch Apex k provedení každé transakce v samostatném vláknu, aniž by každého z nich rušili a dokončili svůj úkol.







V zásadě limity guvernéra v Salesforce omezují zpracování a provádění ve více transakcích. „Limity vrcholu transakce“ se počítají pro každou transakci a „Limit vrcholu specifické pro velikost“ se zabývá velikostí kódu. Salesforce podporuje dva procesy: synchronní a asynchronní procesy. V synchronním procesu je skript Apex spuštěn najednou, zatímco v asynchronním procesu se skript Apex provádí rozdělením do více úloh.



Povolené limity

Pojďme diskutovat o limitu pro různé scénáře:



  1. Může být možné zpracovat/spustit 100 SOQL dotazů v synchronním Apexu a 200 SOQL dotazů v asynchronním Apexu.
  2. Z dotazu SOQL se vrátí pouze 50 000 záznamů pro synchronní i asynchronní vrchol.
  3. Pokud použijeme Database.getQueryLocator(), je vráceno pouze 10 000 najednou pro synchronní i asynchronní Apex.
  4. V obou scénářích je počet vydaných dotazů SOSL 20.
  5. Velikost haldy, která je nutná pro zpracování synchronního Apexu, je 6 MB. Pro asynchronní Apex je požadovaná velikost haldy dvojnásobná, což činí 12 MB.
  6. Maximální čas CPU, který je povolen pro synchronní Apex, je 10 000 milisekund a 60 000 milisekund pro asynchronní Apex.
  7. Na provedení pro oba Apex je povoleno pouze 10 minut.
  8. V obou případech můžeme použít pouze metodu 10 sendEmail() se 100 příjemci.
  9. Znaky, které jsou přítomné ve třídě Apex nebo ve spouštěči Apex, musí být v rozmezí 1 milionu.
  10. V Batch Apex (asynchronní) je velikost 200. QueryLocator() třídy „Database“ vrací 50 milionů záznamů na transakci.
  11. Pouze 5 úloh Apex bude ve frontě nebo aktivních.

Příklad třídy LIMIT:

Apex může specifikovat Governor limity ve třídě „LIMIT“. Tato třída poskytuje některé metody, které sdělují limity guvernéra. Podívejme se na následující příklad, který zobrazuje některé limity guvernéra:





System.debug('Počet agregovaných dotazů, které lze zpracovat: '+ Limits.getLimitAggregateQueries());

System.debug('Počet příkazů webové služby, které lze zpracovat: '+ Limits.getLimitCallouts());

System.debug('Počet záznamů, které lze zpracovat: '+ Limits.getLimitDmlRows());

System.debug('Počet DML příkazů lze volat: '+ Limits.getLimitDmlStatements());

System.debug('Celkové množství paměti v bajtech: '+ Limits.getLimitHeapSize());

System.debug('Počet dotazů SOQL lze zadat: '+ Limits.getLimitQueries());

System.debug('Je možné vydat počet záznamů: '+ Limits.getLimitQueryRows());

System.debug('Je možné zadat počet SOSL dotazů:  '+ Limits.getLimitSoslQueries());

Výstup:

Je také možné zkontrolovat, kolik příkazů/řádků DML lze vrátit pomocí metod „dome“, které jsou přítomny ve třídě „LIMIT“.



  1. Limits.getDMLStatements() vrátí celkový počet příkazů DML, které jsou použity v instanci.
  2. Limits.getDMLRows() vrátí celkový počet řádků, které jsou vráceny příkazy DML.
  3. Limits.getCpuTime() vrací čas využitý CPU pro aktuální transakci v milisekundách.

Příklad použití:

Pojďme napsat dotaz SOQL, který vrátí dva záznamy z objektu „WorkOrder“. Poté tyto dva záznamy smažte pomocí „delete“ DML.

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

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

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

// SOQL Dotaz na výběr 2 řádků z objektu WorkOrder

Seznam účtů = [SELECT Id FROM WorkOrder LIMIT 2];

//Použijte delete DML k odstranění dvou řádků

odstranit účty;

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

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

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

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

Výstup:

V daném příkladu nejsou žádné příkazy DML a 0 řádků. Stávající čas CPU je 1 milisekunda. Po vrácení 2 řádků z dotazu SOQL a odstranění těchto dvou řádků je celkový počet příkazů DML vrácených funkcí Limits.getDMLStatements() 1, celkový počet řádků vrácených funkcí Limits.getDMLRows() je 2 a CPU čas potřebný k provedení této transakce je 51 milisekund.

Příklad osvědčeného postupu:  „NIKDY NEPOUŽÍVEJTE DML UVNITŘ SMYČKY“

Podívejme se, jak můžeme spustit kód, aniž bychom získali limit guvernéra. Nejprve vytvoříme záznam o objektu „Product“ (API – Product2) z  objektu „WorkOrder“ přiřazením „WorkOrder“ pod „Název produktu“ v samotné smyčce „for“. Podívejme se na následující kód:

Produkt2 prod_obj;

pro (WorkOrder wo_object: [VYBRAT předmět Z WorkOrder])

{

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

vložit prod_obj;

}

Můžeme to udělat lepším způsobem deklarováním seznamu (prod_s) a uložením prod_obj do seznamu. Tento seznam můžeme vložit do produktu mimo smyčku.

Seznam prod_s = new Seznam();

Produkt2 prod_obj;

pro (WorkOrder wo_object: [VYBRAT předmět Z WorkOrder])

{

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

prod_s.add(prod_obj);

}

vložit prod_obj;

Závěr

Nyní jsme se dozvěděli, jaké jsou limity Apex v Salesforce, s podrobným vysvětlením. Je lepší jít s procesem Asynchronous Apex, abyste získali lepší limity guvernérů ve srovnání se Synchronous Apex. Dozvěděli jsme se také o limitech guvernéra pro různé scénáře a poskytli jsme ukázkovou ukázku počtu limitů ze třídy „Limit“. Také jsme ověřili počet příkazů DML, řádků a času CPU spuštěním jednoho příkazu DML. Tuto příručku jsme uzavřeli diskusí o jednom příkladu nejlepší praxe.