Salesforce Apex – Had Gabenor

Salesforce Apex Had Gabenor



Salesforce membolehkan kami memproses atau melaksanakan bilangan penyata/rekod tertentu pada satu masa. Terdapat beberapa had untuk penyataan DML, kelas Apex, dsb., untuk dilaksanakan atau diproses. Had ini dikenali sebagai had Gabenor. Dalam tutorial ini, kita akan melihat apa had Gabenor dan bagaimana ia boleh dikendalikan. Selain itu, Salesforce Apex menyediakan kelas 'Had' untuk mengetahui had yang berkaitan dengan serlahan ciri, kelas Apex, komponen web kilat, pernyataan SOSL dan SOQL.

Had Gabenor

Pertimbangkan senario di mana Alish dan Subash ialah dua orang yang menggunakan org Salesforce. Alice mahu memproses atau melaksanakan 1000 penyata DML  dalam satu transaksi. Secara selari, Subash mahu memuatkan 5000 rekod pada satu masa. Jika mereka melakukannya secara selari, Salesforce tidak akan menerima dan menjadi sibuk. Oleh itu, had Gabenor dapat dilihat. Dalam kes ini, Alish boleh memproses 100 DML pada satu masa dan Subash boleh memproses 500 rekod pada satu masa. Mereka boleh menggunakan AsynchronousBatch Apex untuk melakukan setiap transaksi pada urutan yang berasingan tanpa mengganggu setiap daripada mereka dan menyelesaikan tugas mereka.







Pada asasnya, had Gabenor dalam Salesforce mengehadkan pemprosesan dan pelaksanaan dalam berbilang transaksi. “Had Puncak Setiap Transaksi” dikira untuk setiap transaksi dan “Had Puncak Khusus Saiz” memperkatakan saiz  kod. Salesforce menyokong dua proses: proses segerak dan tak segerak. Dalam proses segerak, skrip Apex dilaksanakan sekali gus manakala dalam proses tak segerak, skrip Apex dilaksanakan dengan membahagikan kepada berbilang kerja.



Had yang Dibenarkan

Mari bincangkan kiraan had untuk senario yang berbeza:



  1. Anda boleh memproses/menjalankan 100 pertanyaan SOQL dalam Apex segerak dan 200 pertanyaan SOQL dalam Apex asynchronous.
  2. Hanya 50,000 rekod akan kembali daripada pertanyaan SOQL untuk kedua-dua puncak segerak dan tak segerak.
  3. Jika kami menggunakan Database.getQueryLocator(), hanya 10,000 dikembalikan pada satu masa untuk Apex segerak dan tak segerak.
  4. Dalam kedua-dua senario, bilangan pertanyaan SOSL yang dikeluarkan ialah 20.
  5. Saiz timbunan yang diperlukan untuk memproses Apex segerak ialah 6 MB. Untuk Apex asynchronous, saiz timbunan yang diperlukan adalah dua kali ganda yang menjadikannya 12 MB.
  6. Masa CPU maksimum yang dibenarkan untuk Apex segerak ialah 10,000 milisaat dan 60,000 milisaat untuk Apex tak segerak.
  7. Hanya 10 minit dibenarkan untuk pelaksanaan kedua-dua Apex.
  8. Dalam kedua-dua kes, kami hanya boleh menggunakan 10 kaedah sendEmail() dengan 100 penerima.
  9. Watak yang terdapat dalam kelas Apex atau dalam pencetus Apex mestilah dalam lingkungan 1 juta.
  10. Dalam Batch Apex (tak segerak), saiznya ialah 200. QueryLocator() bagi kelas 'Pangkalan Data' mengembalikan 50 juta rekod setiap transaksi.
  11. Hanya 5 pekerjaan Apex akan berada dalam baris gilir atau aktif.

Contoh Kelas LIMIT:

Apex boleh menentukan had Gabenor dalam kelas 'LIMIT'. Kelas ini menyediakan beberapa kaedah yang memberitahu had Gabenor. Mari lihat contoh berikut yang memaparkan beberapa had Gabenor:





System.debug('Bilangan pertanyaan agregat boleh diproses: '+ Limits.getLimitAggregateQueries());

System.debug('Bilangan penyata perkhidmatan Web boleh diproses: '+ Limits.getLimitCallouts());

System.debug('Bilangan rekod boleh diproses: '+ Limits.getLimitDmlRows());

System.debug('Bilangan pernyataan DML boleh dipanggil: '+ Limits.getLimitDmlStatements());

System.debug('Jumlah jumlah memori dalam bait: '+ Limits.getLimitHeapSize());

System.debug('Bilangan pertanyaan SOQL boleh dikeluarkan: '+ Limits.getLimitQueries());

System.debug('Bilangan rekod boleh dikeluarkan: '+ Limits.getLimitQueryRows());

System.debug('Bilangan pertanyaan SOSL boleh dikeluarkan:  '+ Limits.getLimitSoslQueries());

Pengeluaran:

Anda juga boleh menyemak bilangan pernyataan/baris DML yang boleh dikembalikan menggunakan kaedah 'kubah' yang terdapat dalam kelas 'LIMIT'.



  1. Limits.getDMLSstatements() mengembalikan jumlah pernyataan DML yang digunakan pada contoh.
  2. Limits.getDMLRows() mengembalikan jumlah bilangan baris yang dikembalikan oleh penyata DML.
  3. Limits.getCpuTime() mengembalikan masa CPU yang digunakan untuk transaksi semasa dalam milisaat.

Contoh Penggunaan:

Mari tulis pertanyaan SOQL yang mengembalikan dua rekod daripada objek 'WorkOrder'. Selepas itu, padamkan kedua-dua rekod ini menggunakan DML 'padam'.

System.debug('DML Statements:'+Limits.getDMLSstatements());

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

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

// SOQL Query untuk memilih 2 baris daripada objek WorkOrder

Senaraikan akaun = [PILIH Id DARIPADA WorkOrder HAD 2];

//Gunakan padam DML untuk memadam dua baris

memadam akaun;

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

System.debug('DML Statements:'+Limits.getDMLSstatements());

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

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

Pengeluaran:

Dalam contoh yang diberikan, tiada pernyataan DML dan 0 baris. Masa CPU sedia ada ialah 1 milisaat. Selepas mengembalikan 2 baris daripada pertanyaan SOQL dan memadamkan dua baris ini, jumlah bilangan pernyataan DML yang dikembalikan oleh Limits.getDMLSstatements() ialah 1, jumlah baris yang dikembalikan oleh Limits.getDMLRows()  ialah 2 dan CPU masa yang diperlukan untuk melaksanakan transaksi ini ialah 51 milisaat.

Contoh Amalan Terbaik:  “JANGAN PERNAH GUNAKAN DML DI DALAM GELANG”

Mari lihat bagaimana kita boleh menjalankan kod tanpa mendapat had gabenor. Kami mula-mula membuat rekod pada objek 'Produk' (API – Product2) daripada  objek 'WorkOrder' dengan memberikan subjek 'WorkOrder' kepada 'Nama Produk' dalam gelung 'untuk' itu sendiri. Mari lihat kod berikut:

Product2 prod_obj;

untuk (WorkOrder wo_object : [SELECT Subject FROM WorkOrder])

{

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

masukkan prod_obj;

}

Kita boleh melakukan ini dengan cara yang lebih baik dengan mengisytiharkan senarai (prod_s) dan kemudian menyimpan prod_obj dalam senarai. Kita boleh memasukkan senarai ini ke dalam produk di luar gelung.

List prod_s = new List();

Product2 prod_obj;

untuk (WorkOrder wo_object : [SELECT Subject FROM WorkOrder])

{

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

prod_s.add(prod_obj);

}

masukkan prod_obj;

Kesimpulan

Kami kini mengetahui had Apex dalam Salesforce dengan penjelasan terperinci. Adalah lebih baik untuk menggunakan proses Asynchronous Apex untuk mendapatkan had Gabenor yang lebih baik jika dibandingkan dengan Synchronous Apex. Kami juga mengetahui tentang had Gabenor untuk senario yang berbeza dan memberikan contoh demonstrasi mengenai kiraan had daripada kelas 'Had'. Kami juga mengesahkan kiraan penyata DML, baris dan masa CPU dengan menjalankan satu penyata DML. Kami menyimpulkan panduan ini dengan membincangkan satu contoh amalan terbaik.