Salesforce Apex – Ograničenja guvernera

Salesforce Apex Ogranicenja Guvernera



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:



  1. Može biti moguće obraditi/pokrenuti 100 SOQL upita u sinkronom Apexu i 200 SOQL upita u asinkronom Apexu.
  2. Samo 50 000 zapisa vratit će se iz SOQL upita za sinkroni i asinkroni vrh.
  3. Ako koristimo Database.getQueryLocator(), vraća se samo 10 000 odjednom i za sinkroni i za asinkroni Apex.
  4. U oba scenarija, broj izdanih SOSL upita je 20.
  5. 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.
  6. Maksimalno CPU vrijeme koje je dopušteno za sinkroni Apex je 10 000 milisekundi i 60 000 milisekundi za asinkroni Apex.
  7. Samo 10 minuta dopušteno je za izvođenje za oba Apexa.
  8. U oba slučaja možemo koristiti samo 10 sendEmail() metodu sa 100 primatelja.
  9. Broj znakova koji su prisutni u Apex klasi ili Apex okidaču mora biti unutar 1 milijuna.
  10. U Batch Apex (asinkronom) veličina je 200. QueryLocator() klase 'Database' vraća 50 milijuna zapisa po transakciji.
  11. 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'.



  1. Limits.getDMLStatements() vraća ukupne DML izjave koje se koriste u instanci.
  2. Ograničenja.getDMLRows() vraća ukupan broj redaka koje su vratile DML izjave.
  3. 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 accounts = [SELECT Id FROM WorkOrder LIMIT 2];

//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.

Popis prod_s = novi Popis();

Product2 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.