Salesforce nam omogućuje obradu ili izvršavanje određenog broja izjava/zapisa odjednom. Postoje neka ograničenja za DML izjave, Apex klase, itd., za izvršavanje ili obradu. Ova ograničenja poznata su kao ograničenja guvernera. U ovom vodiču vidjet ćemo što su ograničenja guvernera i kako se njima može postupati. Također, Salesforce Apex pruža klasu “Limit” za poznavanje ograničenja koja se odnose na oblačiće, Apex klase, munjevite web komponente, SOSL i SOQL izjave.
Guverner Limits
Razmotrite scenarij u kojem su Alish i Subash dvije osobe koje koriste Salesforce org. Alice želi obraditi ili izvršiti 1000 DML izjava u jednoj transakciji. Paralelno, Subash želi učitati 5000 zapisa odjednom. Ako to rade paralelno, Salesforce neće prihvatiti i postaje užurban. Stoga guvernerova ograničenja dolaze na scenu. U ovom slučaju Alish može obraditi 100 DML-a odjednom, a Subash može obraditi 500 zapisa odjednom. Oni mogu koristiti AsynchronousBatch Apex za obavljanje svake transakcije na zasebnoj niti bez ometanja svake od njih i dovršavanje njihovog zadatka.
U osnovi, Governorova ograničenja u Salesforceu ograničavaju obradu i izvršenje u više transakcija. 'Apex ograničenja po transakciji' računaju se za svaku transakciju, a 'Apex ograničenje specifično za veličinu' odnosi se na veličinu koda. Salesforce podržava dva procesa: sinkrone i asinkrone procese. U sinkronom procesu, Apex skripta se izvršava u jednom potezu, dok se u asinkronom procesu, Apex skripta izvršava dijeljenjem na više poslova.
Dopuštena ograničenja
Raspravljajmo o broju ograničenja za različite scenarije:
- Može biti moguće obraditi/pokrenuti 100 SOQL upita u sinkronom Apexu i 200 SOQL upita u asinkronom Apexu.
- Samo 50 000 zapisa vratit će se iz SOQL upita za sinkroni i asinkroni vrh.
- Ako koristimo Database.getQueryLocator(), vraća se samo 10 000 odjednom i za sinkroni i za asinkroni Apex.
- U oba scenarija, broj izdanih SOSL upita je 20.
- Veličina gomile koja je potrebna za obradu sinkronog Apexa je 6 MB. Za asinkroni Apex potrebna je veličina hrpe dvostruka što čini 12 MB.
- Maksimalno CPU vrijeme koje je dopušteno za sinkroni Apex je 10 000 milisekundi i 60 000 milisekundi za asinkroni Apex.
- Samo 10 minuta dopušteno je za izvođenje za oba Apexa.
- U oba slučaja možemo koristiti samo 10 sendEmail() metodu sa 100 primatelja.
- Broj znakova koji su prisutni u Apex klasi ili Apex okidaču mora biti unutar 1 milijuna.
- U Batch Apex (asinkronom) veličina je 200. QueryLocator() klase 'Database' vraća 50 milijuna zapisa po transakciji.
- Samo 5 Apex poslova bit će u redu ili aktivno.
Primjer klase LIMIT:
Apex može odrediti ograničenja guvernera u klasi 'LIMIT'. Ova klasa pruža neke metode koje guverneru govore o granicama. Pogledajmo sljedeći primjer koji prikazuje neka ograničenja guvernera:
System.debug('Broj zbirnih upita koji se mogu obraditi: '+ Limits.getLimitAggregateQueries());
System.debug('Broj izjava web usluge koje se mogu obraditi: '+ Limits.getLimitCallouts());
System.debug('Broj zapisa koji se mogu obraditi: '+ Limits.getLimitDmlRows());
System.debug('Broj DML iskaza može se pozvati: '+ Limits.getLimitDmlStatements());
System.debug('Ukupna količina memorije u bajtovima: '+ Limits.getLimitHeapSize());
System.debug('Broj SOQL upita koji se mogu izdati: '+ Limits.getLimitQueries());
System.debug('Broj zapisa koji se mogu izdati: '+ Limits.getLimitQueryRows());
System.debug('Broj SOSL upita koji se mogu izdati: '+ Limits.getLimitSoslQueries());
Izlaz:
Također je moguće provjeriti koliko se DML naredbi/redova može vratiti korištenjem metoda 'kupole' koje su prisutne u klasi 'LIMIT'.
- Limits.getDMLStatements() vraća ukupne DML izjave koje se koriste u instanci.
- Ograničenja.getDMLRows() vraća ukupan broj redaka koje su vratile DML izjave.
- Limits.getCpuTime() vraća CPU iskorišteno vrijeme za trenutnu transakciju u milisekundama.
Primjer upotrebe:
Napišimo SOQL upit koji vraća dva zapisa iz objekta 'WorkOrder'. Nakon toga izbrišite ova dva zapisa pomoću DML-a 'delete'.
System.debug('DML Izjave:'+Limits.getDMLStatements());System.debug('Reci: '+Limits.getDmlRows());
System.debug('CPU vrijeme '+Limits.getCpuTime());
// SOQL upit za odabir 2 retka iz objekta WorkOrder
List
//Koristite delete DML za brisanje dva retka
brisati račune;
System.debug('**Nakon SOQL-a:**');
System.debug('DML Izjave:'+Limits.getDMLStatements());
System.debug('Reci: '+Limits.getDmlRows());
System.debug('CPU vrijeme '+Limits.getCpuTime());
Izlaz:
U navedenom primjeru nema DML naredbi i 0 redaka. Postojeće CPU vrijeme je 1 milisekunda. Nakon vraćanja 2 retka iz SOQL upita i brisanja ta dva retka, ukupan broj DML iskaza koje vraća Limits.getDMLStatements() je 1, ukupni broj redaka koje vraća Limits.getDMLRows() je 2, a CPU vrijeme koje je potrebno za izvršenje ove transakcije je 51 milisekunda.
Primjer najbolje prakse: 'NIKADA NE KORISTITE DML UNUTAR PETLJE'
Pogledajmo kako možemo pokrenuti kod bez dobivanja ograničenja regulatora. Prvo stvaramo zapis o objektu “Proizvod” (API – Proizvod2) iz objekta “Radni nalog” dodjeljivanjem predmeta “Radni nalog” “Nazivu proizvoda” u samoj petlji “za”. Pogledajmo sljedeći kod:
Product2 proizvod_obj;za (WorkOrder wo_object : [SELECT Subject FROM WorkOrder])
{
proizvod_obj = novi Proizvod2(Ime = wo_object.Predmet);
umetnite prod_obj;
}
To možemo učiniti na bolji način deklariranjem popisa (prod_s) i zatim pohranjivanjem prod_obj-a na popis. Ovaj popis možemo umetnuti u proizvod izvan petlje.
PopisProduct2 proizvod_obj;
za (WorkOrder wo_object : [SELECT Subject FROM WorkOrder])
{
proizvod_obj = novi Proizvod2(Ime = wo_object.Predmet);
proizvod_s.add(prod_obj);
}
umetnite prod_obj;
Zaključak
Sada smo naučili što su Apex ograničenja u Salesforceu uz detaljno objašnjenje. Bolje je koristiti Asinkroni Apex proces kako biste dobili bolja ograničenja guvernera u usporedbi sa Sinkronim Apexom. Također smo naučili o ograničenjima guvernera za različite scenarije i dali primjer demonstracije u vezi s brojanjem ograničenja iz klase 'Ograničenje'. Također smo provjerili broj DML naredbi, redaka i CPU vremena izvođenjem jedne DML naredbe. Zaključili smo ovaj vodič raspravom o jednom primjeru najbolje prakse.