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 скриптът се изпълнява чрез разделяне на множество задания.
Позволени лимити
Нека обсъдим лимита за различни сценарии:
- Възможно е да се обработват/изпълнят 100 SOQL заявки в синхронен Apex и 200 SOQL заявки в асинхронен Apex.
- Само 50 000 записа ще се върнат от SOQL заявка както за синхронен, така и за асинхронен връх.
- Ако използваме Database.getQueryLocator(), само 10 000 се връщат наведнъж както за синхронен, така и за асинхронен Apex.
- И в двата сценария броят на издадените SOSL заявки е 20.
- Размерът на купчината, необходим за обработка на синхронния Apex, е 6 MB. За асинхронен Apex необходимият размер на купчината е двоен, което го прави 12 MB.
- Максималното процесорно време, разрешено за синхронен Apex, е 10 000 милисекунди и 60 000 милисекунди за асинхронен Apex.
- Разрешени са само 10 минути за изпълнение и за двата Apex.
- И в двата случая можем да използваме само 10 метода sendEmail() със 100 получателя.
- Знаците, които присъстват в класа Apex или в тригера Apex, трябва да са в рамките на 1 милион.
- В Batch Apex (асинхронно) размерът е 200. QueryLocator() на класа „Database“ връща 50 милиона записа на транзакция.
- Само 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“.
- Limits.getDMLStatements() връща общите DML изрази, които се използват в даден екземпляр.
- Limits.getDMLRows() връща общия брой редове, върнати от DML изразите.
- 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
//Използвайте 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 израз. Завършихме това ръководство с обсъждане на един пример за най-добра практика.