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:
- 100 SOQL lekérdezés feldolgozása/futtatása lehetséges szinkron Apexben és 200 SOQL lekérdezés aszinkron Apexben.
- Mindössze 50 000 rekord érkezik vissza egy SOQL-lekérdezésből mind a szinkron, mind az aszinkron csúcsra.
- Ha a Database.getQueryLocator()-ot használjuk, egyszerre csak 10 000 kerül visszaadásra mind a szinkron, mind az aszinkron Apex esetében.
- Mindkét esetben a kiadott SOSL-lekérdezések száma 20.
- 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.
- 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.
- Mindössze 10 perc áll rendelkezésre a végrehajtásra mindkét Apex esetében.
- Mindkét esetben csak 10 sendEmail() metódust használhatunk 100 címzettnél.
- Az Apex osztályban vagy az Apex triggerben szereplő karaktereknek 1 millión belül kell lenniük.
- A Batch Apexben (aszinkron) a méret 200. Az „Adatbázis” osztály QueryLocator()-ja tranzakciónként 50 millió rekordot ad vissza.
- 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.
- Limits.getDMLStatements() a példányon használt összes DML utasítást adja vissza.
- Limits.getDMLRows() a DML utasítások által visszaadott sorok teljes számát adja vissza.
- 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
//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.
ListaProduct2 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.