Salesforce Apex – Batas Gubernur

Salesforce Apex Batas Gubernur



Salesforce memungkinkan kita memproses atau mengeksekusi sejumlah pernyataan/catatan tertentu dalam satu waktu. Ada beberapa batasan untuk pernyataan DML, kelas Apex, dll., untuk dieksekusi atau diproses. Batasan ini dikenal sebagai batas Gubernur. Dalam tutorial ini, kita akan melihat apa itu batasan Gubernur dan bagaimana cara menanganinya. Selain itu, Salesforce Apex menyediakan kelas 'Limit' untuk mengetahui batasan yang terkait dengan info, kelas Apex, komponen web kilat, pernyataan SOSL dan SOQL.

Batas Gubernur

Pertimbangkan skenario di mana Alish dan Subash adalah dua orang yang menggunakan organisasi Salesforce. Alice ingin memproses atau menjalankan 1.000 pernyataan DML dalam satu transaksi. Secara paralel, Subash ingin memuat 5.000 rekaman sekaligus. Jika mereka melakukannya secara paralel, Salesforce tidak akan menerima dan menjadi sibuk. Oleh karena itu, batasan Gubernur muncul. Dalam hal ini, Alish dapat memproses 100 DML sekaligus dan Subash dapat memproses 500 rekaman sekaligus. Mereka dapat menggunakan AsynchronousBatch Apex untuk melakukan setiap transaksi pada utas terpisah tanpa mengganggu masing-masing dan menyelesaikan tugas mereka.







Pada dasarnya, batasan Gubernur di Salesforce membatasi pemrosesan dan eksekusi dalam banyak transaksi. “Batas Apex Per Transaksi” dihitung untuk setiap transaksi dan “Batas Apex Spesifik Ukuran” berhubungan dengan ukuran kode. Salesforce mendukung dua proses: proses sinkron dan asinkron. Dalam proses sinkron, skrip Apex dijalankan dalam sekali jalan sementara dalam proses asinkron, skrip Apex dijalankan dengan membagi menjadi beberapa pekerjaan.



Batas yang Diizinkan

Mari kita bahas jumlah batas untuk berbagai skenario:



  1. Dimungkinkan untuk memproses/menjalankan 100 kueri SOQL di Apex sinkron dan 200 kueri SOQL di Apex asinkron.
  2. Hanya 50.000 rekaman yang akan dikembalikan dari kueri SOQL untuk apex sinkron dan asinkron.
  3. Jika kita menggunakan Database.getQueryLocator(), hanya 10.000 yang dikembalikan sekaligus untuk Apex sinkron dan asinkron.
  4. Dalam kedua skenario, jumlah kueri SOSL yang dikeluarkan adalah 20.
  5. Ukuran tumpukan yang diperlukan untuk memproses Apex sinkron adalah 6 MB. Untuk Apex asinkron, ukuran heap yang diperlukan adalah dua kali lipat sehingga menjadi 12 MB.
  6. Waktu CPU maksimum yang diperbolehkan untuk Apex sinkron adalah 10.000 milidetik dan 60.000 milidetik untuk Apex asinkron.
  7. Hanya 10 menit yang diperbolehkan untuk eksekusi kedua Apex.
  8. Dalam kedua kasus tersebut, kita hanya dapat menggunakan 10 metode sendEmail() dengan 100 penerima.
  9. Karakter yang hadir di kelas Apex atau pemicu Apex harus dalam jarak 1 juta.
  10. Di Batch Apex (asinkron), ukurannya adalah 200. QueryLocator() dari kelas 'Database' mengembalikan 50 juta record per transaksi.
  11. Hanya 5 pekerjaan Apex yang akan berada dalam antrian atau aktif.

Contoh Kelas LIMIT:

Apex dapat menentukan batas Gubernur di kelas 'LIMIT'. Kelas ini menyediakan beberapa metode yang memberitahukan batasan Gubernur. Mari kita lihat contoh berikut yang menampilkan beberapa batasan Gubernur:





System.debug('Jumlah query agregat dapat diproses: '+ Limits.getLimitAggregateQueries());

System.debug('Jumlah pernyataan layanan Web yang dapat diproses: '+ Limits.getLimitCallouts());

System.debug('Jumlah record yang dapat diproses: '+ Limits.getLimitDmlRows());

System.debug('Jumlah pernyataan DML dapat dipanggil: '+ Limits.getLimitDmlStatements());

System.debug('Jumlah total memori dalam byte: '+ Limits.getLimitHeapSize());

System.debug('Jumlah kueri SOQL dapat dikeluarkan: '+ Limits.getLimitQueries());

System.debug('Jumlah catatan yang dapat dikeluarkan: '+ Limits.getLimitQueryRows());

System.debug('Jumlah kueri SOSL yang dapat dikeluarkan:  '+ Limits.getLimitSoslQueries());

Keluaran:

Dimungkinkan juga untuk memeriksa berapa banyak pernyataan/baris DML yang dapat dikembalikan menggunakan metode 'dome' yang ada di kelas 'LIMIT'.



  1. Limits.getDMLStatements() mengembalikan total pernyataan DML yang digunakan pada sebuah instance.
  2. Limits.getDMLrows() mengembalikan jumlah baris yang dikembalikan oleh pernyataan DML.
  3. Batas.getCpuTime() mengembalikan waktu penggunaan CPU untuk transaksi saat ini dalam milidetik.

Contoh Penggunaan:

Mari tulis kueri SOQL yang mengembalikan dua record dari objek 'WorkOrder'. Setelah itu, hapus kedua catatan ini menggunakan DML 'hapus'.

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

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

System.debug('Waktu CPU '+Limits.getCpuTime());

// Query SOQL untuk memilih 2 baris dari objek WorkOrder

Daftar akun = [SELECT Id FROM WorkOrder LIMIT 2];

//Gunakan delete DML untuk menghapus dua baris

hapus akun;

System.debug('**Setelah SOQL:**');

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

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

System.debug('Waktu CPU '+Limits.getCpuTime());

Keluaran:

Dalam contoh yang diberikan, tidak ada pernyataan DML dan 0 baris. Waktu CPU yang ada adalah 1 milidetik. Setelah mengembalikan 2 baris dari kueri SOQL dan menghapus dua baris ini, jumlah total pernyataan DML yang dikembalikan oleh Limits.getDMLStatements() adalah 1, total baris yang dikembalikan oleh Limits.getDLRows() adalah 2, dan CPU waktu yang diperlukan untuk mengeksekusi transaksi ini adalah 51 milidetik.

Contoh Praktik Terbaik:  “JANGAN PERNAH MENGGUNAKAN DML DI DALAM LOOP”

Mari kita lihat bagaimana kita dapat menjalankan kode tanpa mendapatkan batas gubernur. Pertama-tama, kita membuat rekaman pada objek 'Product' (API – Product2) dari objek 'WorkOrder' dengan menetapkan subjek 'WorkOrder' ke 'Product Name' di loop 'for' itu sendiri. Mari kita lihat kode berikut:

Produk2 prod_obj;

untuk (WorkOrder wo_object : [PILIH Subjek DARI WorkOrder])

{

prod_obj = Produk2 baru (Nama = wo_object.Subjek);

masukkan prod_obj;

}

Kita dapat melakukannya dengan cara yang lebih baik dengan mendeklarasikan daftar (prod_s) dan kemudian menyimpan prod_obj dalam daftar. Kami dapat memasukkan daftar ini ke dalam produk di luar loop.

Daftar prod_s = Daftar baru();

Produk2 prod_obj;

untuk (WorkOrder wo_object : [PILIH Subjek DARI WorkOrder])

{

prod_obj = Produk2 baru (Nama = wo_object.Subjek);

prod_s.tambahkan(prod_obj);

}

masukkan prod_obj;

Kesimpulan

Kami sekarang mempelajari batasan Apex di Salesforce dengan penjelasan terperinci. Lebih baik menggunakan proses Asynchronous Apex untuk mendapatkan batas Gubernur yang lebih baik jika dibandingkan dengan Apex Sinkron. Kami juga belajar tentang batas Gubernur untuk berbagai skenario dan memberikan contoh demonstrasi mengenai hitungan batas dari kelas “Limit”. Kami juga memverifikasi jumlah pernyataan DML, baris, dan waktu CPU dengan menjalankan satu pernyataan DML. Kami menyimpulkan panduan ini dengan membahas satu contoh praktik terbaik.