Salesforce Apex – Όρια Κυβερνήτη

Salesforce Apex Oria Kybernete



Το Salesforce μας επιτρέπει να επεξεργαζόμαστε ή να εκτελούμε έναν συγκεκριμένο αριθμό δηλώσεων/εγγραφών κάθε φορά. Υπάρχουν ορισμένα όρια για τις εντολές DML, τις κλάσεις Apex κ.λπ., για εκτέλεση ή επεξεργασία. Αυτά τα όρια είναι γνωστά ως όρια Κυβερνήτη. Σε αυτό το σεμινάριο, θα δούμε ποια είναι τα όρια του Governor και πώς μπορούν να τα χειριστούν. Επίσης, το Salesforce Apex παρέχει την κλάση 'Limit' για να γνωρίζει τα όρια που σχετίζονται με μηνύματα προώθησης, κλάσεις Apex, στοιχεία web lightning, δηλώσεις SOSL και SOQL.

Όρια Κυβερνήτη

Σκεφτείτε ένα σενάριο όπου ο Alish και ο Subash είναι δύο άτομα που χρησιμοποιούν το Salesforce org. Η Alice θέλει να επεξεργαστεί ή να εκτελέσει 1000 δηλώσεις DML  σε μία συναλλαγή. Παράλληλα, το Subash θέλει να φορτώσει 5000 εγγραφές κάθε φορά. Εάν το κάνουν παράλληλα, η Salesforce δεν θα δεχτεί και γίνεται ταραχώδης. Ως εκ τούτου, τα όρια του Κυβερνήτη μπαίνουν στην εικόνα. Σε αυτήν την περίπτωση, ο Alish μπορεί να επεξεργαστεί 100 DML τη φορά και το Subash μπορεί να επεξεργαστεί 500 εγγραφές κάθε φορά. Μπορούν να χρησιμοποιήσουν το AsynchronousBatch Apex για να κάνουν κάθε συναλλαγή σε ξεχωριστό νήμα χωρίς να ενοχλούν καθένα από αυτά και να ολοκληρώσουν την εργασία τους.







Βασικά, τα όρια Governor στο Salesforce περιορίζουν την επεξεργασία και την εκτέλεση σε πολλαπλές συναλλαγές. Τα 'Όρια κορυφής ανά συναλλαγή' μετρούν για κάθε συναλλαγή και το 'Όριο κορυφής ανά συναλλαγή' αφορά το μέγεθος  του κωδικού. Το 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 MB. Για ασύγχρονο Apex, το μέγεθος του σωρού που απαιτείται είναι διπλάσιο που το καθιστά 12 MB.
  6. Ο μέγιστος χρόνος CPU που επιτρέπεται για το σύγχρονο Apex είναι 10.000 χιλιοστά του δευτερολέπτου και 60.000 χιλιοστά του δευτερολέπτου για το ασύγχρονο Apex.
  7. Επιτρέπονται μόνο 10 λεπτά για την εκτέλεση και για τα δύο Apex.
  8. Και στις δύο περιπτώσεις, μπορούμε να χρησιμοποιήσουμε μόνο 10 μέθοδο sendEmail() με 100 παραλήπτες.
  9. Οι χαρακτήρες που υπάρχουν στην κλάση Apex ή στην ενεργοποίηση Apex πρέπει να είναι εντός 1 εκατομμυρίου.
  10. Στο Batch Apex (ασύγχρονο), το μέγεθος είναι 200. Η QueryLocator() της κλάσης 'Database' επιστρέφει 50 εκατομμύρια εγγραφές ανά συναλλαγή.
  11. Μόνο 5 εργασίες Apex θα βρίσκονται στην ουρά ή θα είναι ενεργές.

Παράδειγμα κατηγορίας LIMIT:

Το Apex μπορεί να καθορίσει τα όρια Governor στην κατηγορία 'LIMIT'. Αυτή η κλάση παρέχει ορισμένες μεθόδους που δηλώνουν τα όρια του Governor. Ας δούμε το ακόλουθο παράδειγμα που εμφανίζει ορισμένα όρια του Κυβερνήτη:





System.debug('Αριθμός συγκεντρωτικών ερωτημάτων που μπορούν να υποβληθούν σε επεξεργασία: '+ Limits.getLimitAggregateQueries());

System.debug('Αριθμός δηλώσεων υπηρεσίας Ιστού μπορούν να υποβληθούν σε επεξεργασία: '+ Limits.getLimitCallouts());

System.debug('Αριθμός εγγραφών που μπορούν να υποβληθούν σε επεξεργασία: '+ Limits.getLimitDmlRows());

System.debug('Ο αριθμός των δηλώσεων DML μπορεί να ονομαστεί: '+ Limits.getLimitDmlStatements());

System.debug('Συνολική ποσότητα μνήμης σε byte: '+ Limits.getLimitHeapSize());

System.debug('Ο αριθμός των ερωτημάτων SOQL μπορεί να εκδοθεί: '+ Limits.getLimitQueries());

System.debug('Αριθμός εγγραφών μπορεί να εκδοθεί: '+ Limits.getLimitQueryRows());

System.debug('Μπορεί να εκδοθεί αριθμός ερωτημάτων SOSL:  '+ Limits.getLimitSoslQueries());

Παραγωγή:

Μπορεί επίσης να είναι δυνατό να ελεγχθεί πόσες δηλώσεις/γραμμές DML μπορούν να επιστραφούν χρησιμοποιώντας τις μεθόδους 'dome' που υπάρχουν στην κλάση 'LIMIT'.



  1. Limits.getDMLStatements() επιστρέφει τις συνολικές δηλώσεις DML που χρησιμοποιούνται σε μια παρουσία.
  2. Limits.getDMLRows() επιστρέφει τον συνολικό αριθμό σειρών που επιστρέφονται από τις δηλώσεις DML.
  3. Limits.getCpuTime() επιστρέφει τον χρόνο χρήσης της CPU για την τρέχουσα συναλλαγή σε χιλιοστά του δευτερολέπτου.

Παράδειγμα χρήσης:

Ας γράψουμε ένα ερώτημα SOQL που επιστρέφει τις δύο εγγραφές από το αντικείμενο 'WorkOrder'. Μετά από αυτό, διαγράψτε αυτές τις δύο εγγραφές χρησιμοποιώντας 'delete' DML.

System.debug('Δηλώσεις DML:'+Limits.getDMLStatements());

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

System.debug('Χρόνος CPU'+Limits.getCpuTime());

// Ερώτημα SOQL για επιλογή 2 σειρών από το αντικείμενο WorkOrder

Λίστα λογαριασμών = [ΕΠΙΛΟΓΗ Αναγνωριστικό ΑΠΟ ΟΡΙΟ 2 της παραγγελίας εργασίας];

//Χρησιμοποιήστε το delete DML για να διαγράψετε δύο σειρές

διαγραφή λογαριασμών.

System.debug('**Μετά το SOQL:**');

System.debug('Δηλώσεις DML:'+Limits.getDMLStatements());

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

System.debug('Χρόνος CPU'+Limits.getCpuTime());

Παραγωγή:

Στο συγκεκριμένο παράδειγμα, δεν υπάρχουν δηλώσεις DML και 0 σειρές. Ο υπάρχων χρόνος CPU είναι 1 χιλιοστό του δευτερολέπτου. Μετά την επιστροφή 2 σειρών από το ερώτημα SOQL και τη διαγραφή αυτών των δύο σειρών, ο συνολικός αριθμός δηλώσεων DML που επιστρέφονται από το Limits.getDMLStatements() είναι 1, οι συνολικές σειρές που επιστρέφονται από το Limits.getDMLRows()  είναι 2 και η CPU Ο χρόνος που απαιτείται για την εκτέλεση αυτής της συναλλαγής είναι 51 χιλιοστά του δευτερολέπτου.

Παράδειγμα βέλτιστης πρακτικής:  'ΜΗΝ ΧΡΗΣΙΜΟΠΟΙΗΣΕΤΕ ΠΟΤΕ DML INSIDE THE LOOP'

Ας δούμε πώς μπορούμε να εκτελέσουμε τον κώδικα χωρίς να λάβουμε το όριο του κυβερνήτη. Πρώτα δημιουργούμε μια εγγραφή στο αντικείμενο 'Προϊόν' (API – Product2) από  το αντικείμενο 'WorkOrder' εκχωρώντας το θέμα 'WorkOrder' στο 'Όνομα προϊόντος' στον ίδιο τον βρόχο 'για'. Ας δούμε τον παρακάτω κώδικα:

Product2 prod_obj;

για (WorkOrder wo_object : [SELECT Subject FROM WorkOrder])

{

prod_obj = νέο Προϊόν2(Όνομα = wo_object.Subject);

εισαγωγή prod_obj;

}

Μπορούμε να το κάνουμε αυτό με καλύτερο τρόπο δηλώνοντας μια λίστα (prod_s) και στη συνέχεια αποθηκεύοντας το prod_obj στη λίστα. Μπορούμε να εισαγάγουμε αυτήν τη λίστα στο προϊόν εκτός του βρόχου.

List prod_s = new List();

Product2 prod_obj;

για (WorkOrder wo_object : [SELECT Subject FROM WorkOrder])

{

prod_obj = νέο Προϊόν2(Όνομα = wo_object.Subject);

prod_s.add(prod_obj);

}

εισαγωγή prod_obj;

συμπέρασμα

Τώρα μάθαμε ποια είναι τα όρια Apex στο Salesforce με μια λεπτομερή εξήγηση. Είναι καλύτερα να ακολουθήσετε τη διαδικασία Asynchronous Apex για να αποκτήσετε καλύτερα όρια Governor σε σύγκριση με το Synchronous Apex. Μάθαμε επίσης για τα όρια του Κυβερνήτη για διαφορετικά σενάρια και κάναμε ένα δείγμα επίδειξης σχετικά με την καταμέτρηση ορίων από την κατηγορία 'Limit'. Επαληθεύσαμε επίσης τον αριθμό των δηλώσεων DML, των σειρών και του χρόνου CPU εκτελώντας μία πρόταση DML. Ολοκληρώσαμε αυτόν τον οδηγό συζητώντας ένα παράδειγμα βέλτιστης πρακτικής.