Salesforce Apex – Kormányzói korlátok

Salesforce Apex Kormanyzoi Korlatok



A Salesforce lehetővé teszi számunkra, hogy egy időben meghatározott számú utasítást/rekordot dolgozzunk fel vagy hajtsunk végre. Vannak bizonyos korlátozások a DML utasítások, Apex osztályok stb. végrehajtására vagy feldolgozására. Ezeket a határokat kormányzói korlátoknak nevezzük. Ebben az oktatóanyagban látni fogjuk, mik a kormányzói korlátok, és hogyan kezelhetők. A Salesforce Apex emellett a „Limit” osztályt is biztosítja a kiemelésekhez, Apex osztályokhoz, Lightning webkomponensekhez, SOSL- és SOQL-utasításokhoz kapcsolódó korlátok megismeréséhez.

Kormányzói határok

Tekintsünk egy olyan forgatókönyvet, amelyben Alish és Subash két személy, aki a Salesforce org-ot használja. Alice 1000 DML utasítást szeretne feldolgozni vagy végrehajtani egy tranzakcióban. Ezzel párhuzamosan a Subash egyszerre 5000 rekordot akar betölteni. Ha párhuzamosan csinálják, a Salesforce nem fogadja el, és hektikussá válik. Ezért a kormányzó korlátai jönnek a képbe. Ebben az esetben az Alish egyszerre 100 DML-t, a Subash pedig 500 rekordot tud feldolgozni egyszerre. Az AsynchronousBatch Apex segítségével minden egyes tranzakciót külön szálon hajthatnak végre anélkül, hogy mindegyiküket megzavarnák, és végrehajthatják a feladatukat.







Alapvetően a Salesforce kormányzói korlátai korlátozzák a több tranzakció feldolgozását és végrehajtását. A „Tranzakciónkénti Apex-korlátok” minden tranzakciónál számítanak, a „Méret-specifikus Apex-korlát” pedig a kód méretére vonatkozik. A Salesforce két folyamatot támogat: szinkron és aszinkron folyamatokat. A szinkron folyamatban az Apex-szkriptet egyetlen lépésben hajtják végre, míg az aszinkron folyamatban az Apex-szkriptet több jobra felosztva hajtják végre.



Engedélyezett határok

Beszéljük meg a határértékeket a különböző forgatókönyveknél:



  1. 100 SOQL lekérdezés feldolgozása/futtatása lehetséges szinkron Apexben és 200 SOQL lekérdezés aszinkron Apexben.
  2. Mindössze 50 000 rekord érkezik vissza egy SOQL-lekérdezésből mind a szinkron, mind az aszinkron csúcsra.
  3. Ha a Database.getQueryLocator()-ot használjuk, egyszerre csak 10 000 kerül visszaadásra mind a szinkron, mind az aszinkron Apex esetében.
  4. Mindkét esetben a kiadott SOSL-lekérdezések száma 20.
  5. A szinkron Apex feldolgozásához szükséges kupacméret 6 MB. Az aszinkron Apex esetében a szükséges kupacméret duplája, ami 12 MB-ot tesz ki.
  6. A maximális CPU-idő, amely a szinkron Apex esetében megengedett, 10 000 ezredmásodperc, az aszinkron Apex esetében pedig 60 000 ezredmásodperc.
  7. Mindössze 10 perc áll rendelkezésre a végrehajtásra mindkét Apex esetében.
  8. Mindkét esetben csak 10 sendEmail() metódust használhatunk 100 címzettnél.
  9. Az Apex osztályban vagy az Apex triggerben szereplő karaktereknek 1 millión belül kell lenniük.
  10. A Batch Apexben (aszinkron) a méret 200. Az „Adatbázis” osztály QueryLocator()-ja tranzakciónként 50 millió rekordot ad vissza.
  11. Csak 5 Apex-feladat lesz sorban vagy aktív.

LIMIT osztály példa:

Az Apex megadhatja a kormányzó korlátokat a „LIMIT” osztályban. Ez az osztály tartalmaz néhány metódust, amelyek megmondják a kormányzó korlátait. Nézzük a következő példát, amely néhány kormányzói korlátot jelenít meg:





System.debug('A feldolgozható összesített lekérdezések száma: '+ Limits.getLimitAggregateQueries());

System.debug('A feldolgozható webszolgáltatási nyilatkozatok száma: '+ Limits.getLimitCallouts());

System.debug('A feldolgozható rekordok száma: '+ Limits.getLimitDmlRows());

System.debug('A DML utasítások száma hívható: '+ Limits.getLimitDmlStatements());

System.debug('A teljes memória mennyisége bájtban: '+ Limits.getLimitHeapSize());

System.debug('A kiadható SOQL lekérdezések száma: '+ Limits.getLimitQueries());

System.debug('A kiadható rekordok száma: '+ Limits.getLimitQueryRows());

System.debug('A kiadható SOSL-lekérdezések száma:  '+ Limits.getLimitSoslQueries());

Kimenet:

Azt is ellenőrizni lehet, hogy hány DML utasítás/sor adható vissza a „LIMIT” osztályban található „dome” metódusokkal.



  1. Limits.getDMLStatements() a példányon használt összes DML utasítást adja vissza.
  2. Limits.getDMLRows() a DML utasítások által visszaadott sorok teljes számát adja vissza.
  3. Limits.getCpuTime() visszaadja az aktuális tranzakció CPU-használati idejét ezredmásodpercben.

Használati példa:

Írjunk egy SOQL-lekérdezést, amely visszaadja a két rekordot a „WorkOrder” objektumból. Ezt követően törölje ezt a két rekordot a „delete” DML használatával.

System.debug('DML utasítások:'+Limits.getDMLStatements());

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

System.debug('CPU idő '+Limits.getCpuTime());

// SOQL lekérdezés 2 sor kiválasztásához a WorkOrder objektumból

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

//Használja a delete DML parancsot két sor törléséhez

fiókok törlése;

System.debug('**SOQL után:**');

System.debug('DML utasítások:'+Limits.getDMLStatements());

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

System.debug('CPU idő '+Limits.getCpuTime());

Kimenet:

Az adott példában nincsenek DML utasítások és 0 sor. A jelenlegi CPU-idő 1 ezredmásodperc. A SOQL lekérdezésből 2 sor visszaadása és e két sor törlése után a Limits.getDMLStatements() által visszaadott DML utasítások teljes száma 1, a Limits.getDMLRows()  által visszaadott sorok száma 2, a CPU pedig a tranzakció végrehajtásához szükséges idő 51 ezredmásodperc.

Példa a bevált gyakorlatra: „SOHA NE HASZNÁLJON DML-t a hurkon belül”

Nézzük meg, hogyan futtathatjuk le a kódot a kormányzókorlát megszerzése nélkül. Először létrehozunk egy rekordot a „Termék” objektumon (API – Product2) a „WorkOrder” objektumból úgy, hogy a „WorkOrder” tárgyat hozzárendeljük a „Product Name”-hez a „for” ciklusban. Lássuk a következő kódot:

Product2 prod_obj;

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

{

prod_obj = új Termék2(Név = wo_objektum.Tárgy);

prod_obj beszúrása;

}

Ezt jobban megtehetjük, ha deklarálunk egy listát (prod_s), majd eltároljuk a prod_obj-t a listában. Ezt a listát a hurkon kívül is beilleszthetjük a termékbe.

Lista prod_s = new Lista();

Product2 prod_obj;

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

{

prod_obj = új Termék2(Név = wo_objektum.Tárgy);

prod_s.add(prod_obj);

}

prod_obj beszúrása;

Következtetés

Most részletes magyarázattal megtudtuk, mik az Apex-korlátok a Salesforce-ban. Jobb, ha az Asynchronous Apex folyamatot használja, hogy jobb kormányzási korlátokat érjen el, mint a Synchronous Apex. Megismerkedtünk a különböző forgatókönyvek kormányzói limitjeivel is, és mintabemutatót adtunk a limitszámlálásról a „Limit” osztályból. Egy DML utasítás futtatásával ellenőriztük a DML utasítások, sorok számát és a CPU-időt is. Ezt az útmutatót egy bevált gyakorlati példa megvitatásával zártuk.