Salesforce Apex: límites del gobernador

Salesforce Apex Limites Del Gobernador



Salesforce nos permite procesar o ejecutar un número particular de extractos/registros a la vez. Hay algunos límites para las declaraciones DML, las clases de Apex, etc., para ejecutar o procesar. Estos límites se conocen como límites del gobernador. En este tutorial, veremos cuáles son los límites del gobernador y cómo se pueden manejar. Además, Salesforce Apex proporciona la clase 'Límite' para conocer los límites relacionados con las llamadas, las clases de Apex, los componentes Lightning Web, las declaraciones SOSL y SOQL.

Límites del gobernador

Considere un escenario donde Alish y Subash son dos personas que usan la organización de Salesforce. Alice quiere procesar o ejecutar 1000 instrucciones DML en una transacción. En paralelo, Subash quiere cargar 5000 registros a la vez. Si lo hacen en paralelo, Salesforce no acepta y se vuelve frenético. Por lo tanto, los límites del Gobernador entran en escena. En este caso, Alish puede procesar 100 DML a la vez y Subash puede procesar 500 registros a la vez. Pueden usar AsynchronousBatch Apex para realizar cada transacción en un hilo separado sin molestar a cada uno de ellos y completar su tarea.







Básicamente, los límites de Gobernador en Salesforce limitan el procesamiento y la ejecución en múltiples transacciones. Los 'Límites de Apex por transacción' cuentan para cada transacción y los 'Límites de Apex por tamaño específico' se ocupan del tamaño del código. Salesforce admite dos procesos: procesos sincrónicos y asincrónicos. En el proceso síncrono, el script de Apex se ejecuta de una sola vez, mientras que en el proceso asíncrono, el script de Apex se ejecuta dividiéndolo en varios trabajos.



Límites permitidos

Analicemos el conteo límite para diferentes escenarios:



  1. Puede ser posible procesar/ejecutar 100 consultas SOQL en Apex síncrono y 200 consultas SOQL en Apex asíncrono.
  2. Solo se devolverán 50 000 registros de una consulta SOQL para el vértice síncrono y asíncrono.
  3. Si usamos Database.getQueryLocator(), solo se devuelven 10 000 a la vez para Apex sincrónico y asincrónico.
  4. En ambos escenarios, el número de consultas SOSL emitidas es de 20.
  5. El tamaño de almacenamiento dinámico necesario para procesar el Apex sincrónico es de 6 MB. Para Apex asíncrono, el tamaño de almacenamiento dinámico requerido es el doble, lo que lo convierte en 12 MB.
  6. El tiempo de CPU máximo permitido para Apex sincrónico es de 10 000 milisegundos y de 60 000 milisegundos para Apex asíncrono.
  7. Solo se permiten 10 minutos para la ejecución de ambos Apex.
  8. En ambos casos, podemos usar solo 10 métodos sendEmail() con 100 destinatarios.
  9. Los caracteres que están presentes en la clase de Apex o en el activador de Apex deben estar dentro de 1 millón.
  10. En Batch Apex (asincrónico), el tamaño es 200. El QueryLocator() de la clase 'Base de datos' devuelve 50 millones de registros por transacción.
  11. Solo 5 trabajos de Apex estarán en cola o activos.

Ejemplo de clase LIMIT:

Apex puede especificar los límites del regulador en la clase 'LIMIT'. Esta clase proporciona algunos métodos que indican los límites del gobernador. Veamos el siguiente ejemplo que muestra algunos límites del gobernador:





System.debug('Número de consultas agregadas que se pueden procesar: '+ Limits.getLimitAggregateQueries());

System.debug('Número de declaraciones de servicios web que se pueden procesar: '+ Limits.getLimitCallouts());

System.debug('Número de registros que se pueden procesar: '+ Limits.getLimitDmlRows());

System.debug('Número de instrucciones DML que se pueden llamar: '+ Limits.getLimitDmlStatements());

System.debug('Cantidad total de memoria en bytes: '+ Limits.getLimitHeapSize());

System.debug('Número de consultas SOQL que se pueden emitir: '+ Limits.getLimitQueries());

System.debug('Número de registros que se pueden emitir: '+ Limits.getLimitQueryRows());

System.debug('Número de consultas SOSL que se pueden emitir:  '+ Limits.getLimitSoslQueries());

Producción:

También es posible verificar cuántas declaraciones/filas DML se pueden devolver utilizando los métodos 'cúpula' que están presentes en la clase 'LIMIT'.



  1. Límites.getDMLStatements() devuelve el total de instrucciones DML que se utilizan en una instancia.
  2. Límites.getDMLRows() devuelve el número total de filas que devuelven las declaraciones DML.
  3. Límites.getCpuTime() devuelve el tiempo utilizado por la CPU para la transacción actual en milisegundos.

Ejemplo de uso:

Escribamos una consulta SOQL que devuelva los dos registros del objeto 'Orden de trabajo'. Después de eso, elimine estos dos registros usando 'eliminar' DML.

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

System.debug('Rows: '+Limits.getDmlRows());

System.debug('Tiempo de CPU'+Limits.getCpuTime());

// Consulta SOQL para seleccionar 2 filas del objeto WorkOrder

List cuentas = [SELECCIONE Id DE WorkOrder LIMIT 2];

//Usar eliminar DML para eliminar dos filas

eliminar cuentas;

System.debug('**Después de SOQL:**');

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

System.debug('Rows: '+Limits.getDmlRows());

System.debug('Tiempo de CPU'+Limits.getCpuTime());

Producción:

En el ejemplo dado, no hay declaraciones DML y 0 filas. El tiempo de CPU existente es de 1 milisegundo. Después de devolver 2 filas de la consulta SOQL y eliminar estas dos filas, el número total de declaraciones DML que devuelve Limits.getDMLStatements() es 1, el total de filas devueltas por Limits.getDMLRows() es 2 y la CPU el tiempo que se necesita para ejecutar esta transacción es de 51 milisegundos.

Ejemplo de mejores prácticas: 'NUNCA USE DML DENTRO DEL CICLO'

Veamos cómo podemos ejecutar el código sin obtener el límite del gobernador. Primero creamos un registro en el objeto 'Producto' (API - Producto2) a partir del objeto 'Orden de trabajo' asignando el asunto 'Orden de trabajo' al 'Nombre del producto' en el bucle 'para'. Veamos el siguiente código:

Producto2 prod_obj;

para (Orden de trabajo wo_object : [SELECCIONE Asunto DE Orden de trabajo])

{

prod_obj = nuevo Producto2(Nombre = wo_object.Subject);

inserte prod_obj;

}

Podemos hacer esto de una mejor manera declarando una lista (prod_s) y luego almacenando prod_obj en la lista. Podemos insertar esta lista en el producto fuera del ciclo.

Lista prod_s = new Lista();

Producto2 prod_obj;

para (Orden de trabajo wo_object : [SELECCIONE Asunto DE Orden de trabajo])

{

prod_obj = nuevo Producto2(Nombre = wo_object.Subject);

prod_s.add(prod_obj);

}

inserte prod_obj;

Conclusión

Ahora aprendimos cuáles son los límites de Apex en Salesforce con una explicación detallada. Es mejor optar por el proceso Asynchronous Apex para obtener mejores límites de gobernador en comparación con Synchronous Apex. También aprendimos sobre los límites del gobernador para diferentes escenarios y dimos una demostración de muestra sobre el conteo de límites de la clase 'Límite'. También verificamos el recuento de declaraciones DML, filas y tiempo de CPU ejecutando una declaración DML. Concluimos esta guía discutiendo un ejemplo de mejores prácticas.