Salesforce Apex — ограничения регулятора

Salesforce Apex Ogranicenia Regulatora



Salesforce позволяет нам обрабатывать или выполнять определенное количество операторов/записей одновременно. Существуют некоторые ограничения на выполнение или обработку операторов DML, классов Apex и т. д. Эти ограничения известны как лимиты регулятора. В этом уроке мы увидим, что такое ограничения Губернатора и как с ними можно справиться. Кроме того, Salesforce Apex предоставляет класс «Limit», чтобы знать ограничения, связанные с выносками, классами Apex, веб-компонентами Lightning, операторами SOSL и SOQL.

Ограничения губернатора

Рассмотрим сценарий, в котором Алиш и Субаш — два человека, использующие организацию Salesforce. Алиса хочет обработать или выполнить 1000 операторов DML за одну транзакцию. Параллельно Субаш хочет загрузить 5000 записей за раз. Если они будут делать это параллельно, Salesforce не примет это и станет лихорадочным. Таким образом, в игру вступают ограничения губернатора. В этом случае Алиш может обрабатывать 100 DML за раз, а Субаш может обрабатывать 500 записей за раз. Они могут использовать AsynchronousBatch Apex для выполнения каждой транзакции в отдельном потоке, не мешая каждому из них, и выполнять свою задачу.







По сути, ограничения регулятора в Salesforce ограничивают обработку и выполнение нескольких транзакций. «Лимит Apex на транзакцию» учитывается для каждой транзакции, а «Лимит Apex для конкретного размера» относится к размеру кода. 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 МБ. Для асинхронного Apex требуется двойной размер кучи, что составляет 12 МБ.
  6. Максимальное время ЦП, разрешенное для синхронного Apex, составляет 10 000 миллисекунд и 60 000 миллисекунд для асинхронного Apex.
  7. На выполнение обоих Apex отводится всего 10 минут.
  8. В обоих случаях мы можем использовать только 10 методов sendEmail() со 100 получателями.
  9. Количество символов, присутствующих в классе Apex или в триггере Apex, должно быть в пределах 1 миллиона.
  10. В Batch Apex (асинхронном) размер равен 200. QueryLocator() класса «База данных» возвращает 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. Лимиты.getDMLStatements() возвращает общее количество операторов DML, используемых в экземпляре.
  2. Лимиты.getDMLRows() возвращает общее количество строк, возвращаемых операторами DML.
  3. Лимиты.getCpuTime() возвращает время использования ЦП для текущей транзакции в миллисекундах.

Пример использования:

Давайте напишем запрос SOQL, который возвращает две записи из объекта «WorkOrder». После этого удалите эти две записи с помощью «delete» DML.

System.debug('Утверждения DML:'+Limits.getDMLStatements());

System.debug('Строки: '+Limits.getDmlRows());

System.debug('Время процессора'+Limits.getCpuTime());

// Запрос SOQL для выбора 2 строк из объекта WorkOrder

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

//Используем delete DML для удаления двух строк

удалять аккаунты;

System.debug('**После SOQL:**');

System.debug('Утверждения DML:'+Limits.getDMLStatements());

System.debug('Строки: '+Limits.getDmlRows());

System.debug('Время процессора'+Limits.getCpuTime());

Выход:

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

Пример передовой практики: «НИКОГДА НЕ ИСПОЛЬЗУЙТЕ DML ВНУТРИ ЦИКЛА»

Давайте посмотрим, как мы можем запустить код, не получая ограничения регулятора. Сначала мы создаем запись об объекте «Продукт» (API — Product2) из ​​объекта «Заказ на работу», назначая субъект «Заказ на работу» на «Название продукта» в самом цикле «для». Давайте посмотрим следующий код:

Продукт2 prod_obj;

for (WorkOrder wo_object: [ВЫБЕРИТЕ тему из WorkOrder])

{

prod_obj = новый продукт2 (имя = wo_object.Subject);

вставить prod_obj;

}

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

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

Продукт2 prod_obj;

for (WorkOrder wo_object: [ВЫБЕРИТЕ тему из WorkOrder])

{

prod_obj = новый продукт2 (имя = wo_object.Subject);

prod_s.add(prod_obj);

}

вставить prod_obj;

Заключение

Теперь мы узнали, что такое ограничения Apex в Salesforce, с подробным объяснением. Лучше использовать процесс асинхронной вершины, чтобы получить лучшие ограничения регулятора по сравнению с синхронной вершиной. Мы также узнали об ограничениях регулятора для различных сценариев и продемонстрировали примерную демонстрацию количества лимитов из класса «Лимит». Мы также проверили количество операторов DML, строк и процессорного времени, запустив один оператор DML. Мы завершили это руководство обсуждением одного примера передовой практики.