Salesforce Apex - Limites do Governador

Salesforce Apex - Limites do Governador

O Salesforce nos permite processar ou executar um número específico de declarações/registros por vez. Existem alguns limites para declarações DML, aulas de ápice, etc., Para executar ou processar. Esses limites são conhecidos como limites do governador. Neste tutorial, veremos o que são os limites do governador e como eles podem ser tratados. Além disso, o Salesforce APEX fornece a classe "limite" para conhecer os limites relacionados a chamadas, aulas de ápice, componentes da Web Lightning, SOSL e SOQL Declarações.

Limites do governador

Considere um cenário em que Alish e Subash são duas pessoas usando a Org Salesforce. Alice deseja processar ou executar 1000 instruções DML em uma transação. Paralelamente, Subash quer carregar 5000 registros por vez. Se eles o fizerem em paralelo, o Salesforce não aceitará e se tornará agitado. Portanto, os limites do governador entram em cena. Nesse caso, Alish pode processar 100 DML por vez e Subash pode processar 500 registros por vez. Eles podem usar o ápice assíncronoombatch para fazer cada transação em um fio separado sem perturbar cada um deles e concluir sua tarefa.

Basicamente, os limites do governador no Salesforce limitam o processamento e a execução em várias transações. Os "limites do ápice da transação" contam para cada transação e "limite de ápice específico de tamanho" lida com o tamanho do código. O Salesforce suporta dois processos: processos síncronos e assíncronos. No processo síncrono, o script Apex é executado em uma única vez enquanto no processo assíncrono, o script do ápice é executado dividindo -se em vários trabalhos.

Limites permitidos

Vamos discutir a contagem de limites para diferentes cenários:

  1. Pode ser possível processar/executar 100 consultas SOQL em ápice síncrono e 200 consultas SOQL no ápice assíncrono.
  2. Apenas 50.000 registros retornarão de uma consulta SOQL para ápice síncrono e assíncrono.
  3. Se usarmos o banco de dados.getQueryLocator (), apenas 10.000 são devolvidos de cada vez para o ápice síncrono e assíncrono.
  4. Nos dois cenários, o número de consultas SOSL emitidas é 20.
  5. O tamanho da pilha necessário para processar o ápice síncrono é de 6 MB. Para ápice assíncrono, o tamanho da pilha necessário é o dobro, o que o torna 12 MB.
  6. O tempo máximo da CPU que é permitido para o ápice síncrono é de 10.000 milissegundos e 60.000 milissegundos para ápice assíncrono.
  7. Apenas 10 minutos são permitidos para a execução para ambos.
  8. Em ambos os casos, podemos usar apenas 10 sendEmail () com 100 destinatários.
  9. Os caracteres que estão presentes na classe Apex ou no gatilho do ápice devem estar dentro de 1 milhão.
  10. No ápice do lote (assíncrono), o tamanho é 200. O querylocator () da classe "banco de dados" retorna 50 milhões de registros por transação.
  11. Apenas 5 trabalhos de ápice estarão na fila ou ativos.

Exemplo de classe limite:

Apex pode especificar os limites do governador na classe "limite". Esta classe fornece alguns métodos que dizem aos limites do governador. Vejamos o exemplo a seguir, que exibe alguns limites do governador:

Sistema.Debug ('Número de consultas agregadas pode ser processado:'+ limites.getlimitAggregateQueries ());
Sistema.Debug ('Número de declarações de serviço da Web pode ser processado:'+ Limites.getLimitCallouts ());
Sistema.Debug ('o número de registros pode ser processado:'+ limites.getlimitdmlRows ());
Sistema.Debug ('Número de declarações DML pode ser chamado:'+ limites.getlImitdmlStatements ());
Sistema.Debug ('quantidade total de memória em bytes:'+ limites.getlImitheApSize ());
Sistema.Debug ('Número de consultas SOQL pode ser emitido:'+ Limites.getLimitQueries ());
Sistema.Debug ('o número de registros pode ser emitido:'+ limites.getlimitQueryRows ());
Sistema.Debug ('Número de consultas SOSL pode ser emitido:'+ Limites.getlimitosSlQueries ());

Saída:

Também pode ser possível verificar quantas instruções/linhas DML podem ser retornadas usando os métodos "cúpulas" que estão presentes na classe "limite".

  1. Limites.getdmlStatements () Retorna as declarações DML total que são usadas em uma instância.
  2. Limites.getdmlRows () Retorna o número total de linhas que são retornadas pelas declarações DML.
  3. Limites.getCputime () Retorna a CPU utilizou o tempo para a transação atual em milissegundos.

Exemplo de uso:

Vamos escrever uma consulta SOQL que retorne os dois registros do objeto "Trabalho". Depois disso, exclua esses dois registros usando o DML "excluir".

Sistema.Debug ('Declarações DML:'+limites.getdmlStatements ());
Sistema.Debug ('linhas:'+limites.getdmlRows ());
Sistema.Debug ('CPU Time'+Limits.getCputime ());
// SOQL Consulta para selecionar 2 linhas do objeto de trabalho
List Contas = [Selecione ID do limite de trabalho 2];
// Use excluir DML para excluir duas linhas
excluir contas;
Sistema.Debug ('** após SOQL: **');
Sistema.Debug ('Declarações DML:'+limites.getdmlStatements ());
Sistema.Debug ('linhas:'+limites.getdmlRows ());
Sistema.Debug ('CPU Time'+Limits.getCputime ());

Saída:

No exemplo dado, não há declarações DML e 0 linhas. O tempo existente da CPU é 1 milissegundo. Depois de devolver 2 linhas da consulta SOQL e excluir essas duas linhas, o número total de declarações DML que é retornada pelos limites.getdmlstatements () é 1, o total de linhas retornadas pelos limites.getdmlRows () é 2 e o tempo de CPU necessário para executar esta transação é de 51 milissegundos.

Exemplo de prática recomendada: “Nunca use DML dentro do loop”

Vamos ver como podemos executar o código sem obter o limite do governador. Primeiro, criamos um registro no objeto "Produto" (API - Product2) do objeto "Trabalho -order", atribuindo o "Order de trabalho" sujeito ao "nome do produto" no próprio loop "para". Vamos ver o seguinte código:

Product2 prod_obj;
Para (Order Wo_Object: [Selecione Assunto do Trabalhador])

prod_obj = new Product2 (nome = wo_object.Assunto);
inserir prod_obj;

Podemos fazer isso de uma maneira melhor declarando uma lista (Prod_s) e depois armazenando o Prod_obj na lista. Podemos inserir esta lista no produto fora do loop.

Lista prod_s = new List ();
Product2 prod_obj;
Para (Order Wo_Object: [Selecione Assunto do Trabalhador])

prod_obj = new Product2 (nome = wo_object.Assunto);
Prod_s.add (prod_obj);

inserir prod_obj;

Conclusão

Agora aprendemos o que os limites do Apex são no Salesforce com uma explicação detalhada. É melhor ir com o processo ápice assíncrono para obter melhores limites do governador quando comparado ao ápice síncrono. Também aprendemos sobre os limites do governador para diferentes cenários e fizemos uma demonstração de amostra sobre a contagem de limites da classe "limite". Também verificamos a contagem de declarações DML, linhas e tempo da CPU executando uma instrução DML. Concluímos este guia discutindo um exemplo de melhor prática.