Salesforce Apex – Лимити на управителя

Salesforce Apex Limiti Na Upravitela



Salesforce ни позволява да обработваме или изпълняваме определен брой отчети/записи наведнъж. Има някои ограничения за DML изрази, Apex класове и т.н. за изпълнение или обработка. Тези лимити са известни като лимити на управителя. В този урок ще видим какво представляват ограниченията на управителя и как могат да бъдат управлявани. Също така, Salesforce Apex предоставя класа „Limit“, за да знаете ограниченията, които са свързани с допълнителни описания, Apex класове, светкавични уеб компоненти, SOSL и SOQL изявления.

Граници на управителя

Помислете за сценарий, при който Алиш и Субаш са двама души, използващи Salesforce org. Алиса иска да обработи или изпълни 1000 DML извлечения в една транзакция. Успоредно с това Subash иска да зареди 5000 записа наведнъж. Ако го направят паралелно, Salesforce няма да приеме и става забързан. Следователно ограниченията на управителя влизат в картината. В този случай Алиш може да обработва 100 DML наведнъж, а Субаш може да обработва 500 записа наведнъж. Те могат да използват AsynchronousBatch Apex, за да извършват всяка транзакция в отделна нишка, без да пречат на всеки от тях и да изпълнят задачата си.







По принцип ограниченията на Governor в Salesforce ограничават обработката и изпълнението на множество транзакции. „Връхните граници за всяка транзакция“ се отчитат за всяка транзакция, а „Специфичният за размера апекс лимит“ се занимава с размера на кода. Salesforce поддържа два процеса: синхронни и асинхронни процеси. В синхронния процес Apex скриптът се изпълнява наведнъж, докато в асинхронния процес Apex скриптът се изпълнява чрез разделяне на множество задания.



Позволени лимити

Нека обсъдим лимита за различни сценарии:



  1. Възможно е да се обработват/изпълнят 100 SOQL заявки в синхронен Apex и 200 SOQL заявки в асинхронен Apex.
  2. Само 50 000 записа ще се върнат от SOQL заявка както за синхронен, така и за асинхронен връх.
  3. Ако използваме Database.getQueryLocator(), само 10 000 се връщат наведнъж както за синхронен, така и за асинхронен Apex.
  4. И в двата сценария броят на издадените SOSL заявки е 20.
  5. Размерът на купчината, необходим за обработка на синхронния Apex, е 6 MB. За асинхронен Apex необходимият размер на купчината е двоен, което го прави 12 MB.
  6. Максималното процесорно време, разрешено за синхронен Apex, е 10 000 милисекунди и 60 000 милисекунди за асинхронен Apex.
  7. Разрешени са само 10 минути за изпълнение и за двата Apex.
  8. И в двата случая можем да използваме само 10 метода sendEmail() със 100 получателя.
  9. Знаците, които присъстват в класа Apex или в тригера Apex, трябва да са в рамките на 1 милион.
  10. В Batch Apex (асинхронно) размерът е 200. QueryLocator() на класа „Database“ връща 50 милиона записа на транзакция.
  11. Само 5 задачи на Apex ще бъдат на опашка или активни.

Пример за клас LIMIT:

Apex може да посочи ограниченията на управителя в класа „LIMIT“. Този клас предоставя някои методи, които указват ограниченията на управителя. Нека да разгледаме следния пример, който показва някои лимити на управителя:





System.debug('Брой обобщени заявки могат да бъдат обработени: '+ Limits.getLimitAggregateQueries());

System.debug('Брой отчети за уеб услуги могат да бъдат обработени: '+ Limits.getLimitCallouts());

System.debug('Брой записи могат да бъдат обработени: '+ Limits.getLimitDmlRows());

System.debug('Брой DML изрази могат да бъдат извикани: '+ Limits.getLimitDmlStatements());

System.debug('Общо количество памет в байтове: '+ Limits.getLimitHeapSize());

System.debug('Брой SOQL заявки могат да бъдат издадени: '+ Limits.getLimitQueries());

System.debug('Брой записи могат да бъдат издадени: '+ Limits.getLimitQueryRows());

System.debug('Брой SOSL заявки могат да бъдат издадени:  '+ Limits.getLimitSoslQueries());

Изход:

Възможно е също така да се провери колко DML оператори/редове могат да бъдат върнати с помощта на методите „купол“, които присъстват в класа „LIMIT“.



  1. Limits.getDMLStatements() връща общите DML изрази, които се използват в даден екземпляр.
  2. Limits.getDMLRows() връща общия брой редове, върнати от DML изразите.
  3. Limits.getCpuTime() връща времето, използвано от процесора за текущата транзакция в милисекунди.

Пример за употреба:

Нека напишем SOQL заявка, която връща двата записа от обекта „WorkOrder“. След това изтрийте тези два записа с помощта на „изтриване“ DML.

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

System.debug('Редове: '+Limits.getDmlRows());

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

// SOQL заявка за избор на 2 реда от обекта WorkOrder

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

//Използвайте delete DML, за да изтриете два реда

изтриване на акаунти;

System.debug('**След SOQL:**');

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

System.debug('Редове: '+Limits.getDmlRows());

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

Изход:

В дадения пример няма DML изрази и 0 реда. Съществуващото процесорно време е 1 милисекунда. След връщане на 2 реда от SOQL заявката и изтриване на тези два реда, общият брой DML изрази, които се връщат от Limits.getDMLStatements() е 1, общият брой редове, върнати от Limits.getDMLRows()  е 2, а процесорът времето, необходимо за изпълнение на тази транзакция, е 51 милисекунди.

Пример за най-добра практика: „НИКОГА НЕ ИЗПОЛЗВАЙТЕ DML В ЦИКЛА“

Нека видим как можем да изпълним кода, без да получим лимита на управителя. Първо създаваме запис на обекта „Продукт“ (API – Product2) от обекта  „Работна поръчка“, като присвояваме субекта „Работна поръчка“ на „Име на продукт“ в самия цикъл „за“. Да видим следния код:

Product2 prod_obj;

за (WorkOrder wo_object : [ИЗБЕРЕТЕ Тема ОТ WorkOrder])

{

prod_obj = нов продукт2(Име = wo_object.Subject);

вмъкнете prod_obj;

}

Можем да направим това по по-добър начин, като декларираме списък (prod_s) и след това съхраним prod_obj в списъка. Можем да вмъкнем този списък в продукта извън цикъла.

Списък<Продукт2> prod_s = нов Списък<Продукт2>();

Product2 prod_obj;

за (WorkOrder wo_object : [ИЗБЕРЕТЕ Тема ОТ WorkOrder])

{

prod_obj = нов продукт2(Име = wo_object.Subject);

prod_s.add(prod_obj);

}

вмъкнете prod_obj;

Заключение

Сега научихме какви са лимитите на Apex в Salesforce с подробно обяснение. По-добре е да преминете към процеса Asynchronous Apex, за да получите по-добри ограничения на управителя в сравнение със Synchronous Apex. Научихме също за лимитите на управителя за различни сценарии и дадохме примерна демонстрация относно броя на лимитите от класа „Лимит“. Ние също така проверихме броя на DML изразите, редовете и процесорното време, като изпълнихме един DML израз. Завършихме това ръководство с обсъждане на един пример за най-добра практика.