Salesforce Apex - Límites de gobernador

Salesforce Apex - Límites de gobernador

Salesforce nos permite procesar o ejecutar un número particular de declaraciones/registros a la vez. Hay algunos límites para declaraciones DML, 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 de "límite" para conocer los límites relacionados con las llamadas, las clases de Apex, los componentes web de Lightning, las declaraciones SOSL y SOQL.

Límites de gobernador

Considere un escenario en el que Alish y Subash son dos personas que usan la Org de Salesforce. Alice quiere procesar o ejecutar declaraciones de 1000 DML en una transacción. En paralelo, Subash quiere cargar 5000 registros a la vez. Si lo hacen en paralelo, Salesforce no aceptará y se vuelve agitado. 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 el Apex Asynchronousbatch para hacer cada transacción en un hilo separado sin perturbar cada uno de ellos y completar su tarea.

Básicamente, los límites del gobernador en Salesforce limitan el procesamiento y la ejecución en múltiples transacciones. "Límites de Apex por transacción" cuenta para cada transacción y el "límite de Apex específico del tamaño" se ocupa del tamaño del código. Salesforce admite dos procesos: procesos sincrónicos y asíncronos. En el proceso sincrónico, el script Apex se ejecuta en una sola GO, mientras que en el proceso asíncrono, el script Apex se ejecuta dividiendo en múltiples trabajos.

Límites permitidos

Discutamos el recuento de límites para diferentes escenarios:

  1. Puede ser posible procesar/ejecutar 100 consultas SOQL en Apex sincrónico y 200 consultas SOQL en Apex asíncrono.
  2. Solo 50,000 registros volverán de una consulta SOQL para el ápice síncrono y asíncrono.
  3. Si usamos la base de datos.getQueryLocator (), solo 10,000 son devueltos a la vez para el ápice sincrónico y asíncrono.
  4. En ambos escenarios, el número de consultas SOSL emitidas es de 20.
  5. El tamaño del montón que se requiere para procesar el ápice sincrónico es de 6 MB. Para el ápice asíncrono, el tamaño del montón requerido es el doble, lo que lo hace 12 MB.
  6. El tiempo máximo de CPU que se permite para el ápice sincrónico es de 10,000 milisegundos y 60,000 milisegundos para el ápice asíncrono.
  7. Solo se permiten 10 minutos para la ejecución para ambos APEX.
  8. En ambos casos, solo podemos usar 10 Método SendEmail () con 100 destinatarios.
  9. Los caracteres que están presentes en la clase APEX o en Apex Trigger deben estar dentro de 1 millón.
  10. En el ápice por lotes (asíncrono), 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 de límite:

APEX puede especificar los límites del gobernador en la clase de "límite". Esta clase proporciona algunos métodos que le dicen a los límites del gobernador. Veamos el siguiente ejemplo que muestra algunos límites del gobernador:

Sistema.Debug ('Número de consultas agregadas se puede procesar:'+ Límites.getLimitAgGreateQueries ());
Sistema.Debug ('El número de declaraciones de servicio web se puede procesar:'+ Límites.getLimitCallouts ());
Sistema.depuración ('se puede procesar el número de registros:'+ límites.getLimitDMlrows ());
Sistema.Debug ('El número de declaraciones DML se puede llamar:'+ Límites.getLimitDMlStatements ());
Sistema.depuración ('cantidad total de memoria en bytes:'+ límites.getLimiteApsize ());
Sistema.Debug (se puede emitir el número de consultas SOQL: '+ Límites.getLimitqueries ());
Sistema.Debug (se puede emitir el número de registros: '+ límites.getLimitQueryRows ());
Sistema.Debug (se puede emitir el número de consultas SOSL: '+ Límites.getLimitSoSlqueries ());

Producción:

También puede ser posible verificar cuántas declaraciones/filas DML se pueden devolver utilizando los métodos de "domo" que están presentes en la clase "Límite".

  1. Límites.getDmlStatements () Devuelve las declaraciones totales de DML que se usan 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 de la CPU para la transacción actual en milisegundos.

Ejemplo de uso:

Escribamos una consulta SOQL que devuelve los dos registros del objeto "Trabajo de trabajo". Después de eso, elimine estos dos registros usando DML "Eliminar".

Sistema.Debug ('DML declaraciones:'+Límites.getDmlStatements ());
Sistema.Debug ('filas:'+límites.getDmlrows ());
Sistema.Debug ('Tiempo de CPU'+Límites.getCputime ());
// consulta SOQL para seleccionar 2 filas del objeto de orden de trabajo
Lista de cuentas = [Seleccione ID del límite de orden de trabajo 2];
// Use Delete DML para eliminar dos filas
eliminar cuentas;
Sistema.debug ('** después de soql: **');
Sistema.Debug ('DML declaraciones:'+Límites.getDmlStatements ());
Sistema.Debug ('filas:'+límites.getDmlrows ());
Sistema.Debug ('Tiempo de CPU'+Límites.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 devueltas por los límites.getDmlStatements () es 1, las filas totales devueltas por los límites.getDmlrows () es 2, y el tiempo de la CPU que se necesita para ejecutar esta transacción es de 51 milisegundos.

Ejemplo de la mejor práctica: "Nunca use DML dentro del bucle"

Veamos cómo podemos ejecutar el código sin obtener el límite del gobernador. Primero creamos un registro en el objeto "Producto" (API - Product2) desde el objeto "PRODISIÓN DE TRABAJO" asignando el sujeto "orden de trabajo" al "nombre del producto" en el bucle "para" en sí mismo. Veamos el siguiente código:

Product2 prod_obj;
para (WorkOrder WO_Object: [Seleccione sujeto desde WorkOrder])

prod_obj = nuevo producto2 (name = wo_object.Sujeto);
insertar prod_obj;

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

List prod_s = new List ();
Product2 prod_obj;
para (WorkOrder WO_Object: [Seleccione sujeto desde WorkOrder])

prod_obj = nuevo producto2 (name = wo_object.Sujeto);
prod_s.agregar (prod_obj);

insertar prod_obj;

Conclusión

Ahora aprendimos qué límites de Apex están en Salesforce con una explicación detallada. Es mejor ir con el proceso de Apex asíncrono para obtener mejores límites de gobernadores en comparación con el ápice sincrónico. También aprendimos sobre los límites del gobernador para diferentes escenarios y dimos una demostración de muestra con respecto al recuento de límites desde la clase de "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 mejor práctica.