Salesforce Apex – Yönetici Limitleri

Salesforce Apex Yonetici Limitleri



Salesforce, bir seferde belirli sayıda ifadeyi/kaydı işlememize veya yürütmemize izin verir. Yürütülecek veya işlenecek DML ifadeleri, Apex sınıfları vb. için bazı sınırlar vardır. Bu limitler Governor limitleri olarak bilinir. Bu eğitimde, Guvernör sınırlarının ne olduğunu ve bunların nasıl ele alınabileceğini göreceğiz. Ayrıca Salesforce Apex, açıklamalar, Apex sınıfları, yıldırım web bileşenleri, SOSL ve SOQL ifadeleriyle ilgili sınırları bilmek için 'Limit' sınıfını sağlar.

Vali Limitleri

Alish ve Subash'ın Salesforce kuruluşunu kullanan iki kişi olduğu bir senaryo düşünün. Alice, tek bir işlemde 1000 DML ifadesini işlemek veya yürütmek istiyor. Buna paralel olarak Subash, bir seferde 5000 kayıt yüklemek istiyor. Paralel olarak yaparlarsa Salesforce kabul etmez ve telaşa kapılır. Dolayısıyla Vali limitleri devreye giriyor. Bu durumda, Alish bir defada 100 DML'yi ve Subash bir defada 500 kaydı işleyebilir. AsynkronBatch Apex'i kullanarak her işlemi ayrı bir iş parçacığı üzerinde her birini rahatsız etmeden yapabilir ve görevlerini tamamlayabilirler.







Temel olarak, Salesforce'taki Governor limitleri, birden çok işlemde işlemeyi ve yürütmeyi sınırlar. Her işlem için 'İşlem Başına Apex Limitleri' sayılır ve 'Boyuta Özgü Apex Limiti', kodun boyutuyla ilgilenir. Salesforce iki işlemi destekler: eşzamanlı ve eşzamansız işlemler. Eşzamanlı işlemde Apex betiği tek seferde yürütülürken, eşzamansız işlemde Apex betiği birden çok işe bölünerek yürütülür.



İzin Verilen Sınırlar

Farklı senaryolar için limit sayısını tartışalım:



  1. Senkron Apex'te 100 SOQL sorgusu, asenkron Apex'te 200 SOQL sorgusu işlemek/çalıştırmak mümkün olabilir.
  2. Hem eşzamanlı hem de eşzamansız apeks için bir SOQL sorgusundan yalnızca 50.000 kayıt döndürülür.
  3. Database.getQueryLocator() işlevini kullanırsak, hem eşzamanlı hem de eşzamansız Apex için bir seferde yalnızca 10.000 döndürülür.
  4. Her iki senaryoda da yayınlanan SOSL sorgularının sayısı 20'dir.
  5. Eşzamanlı Apex'i işlemek için gereken yığın boyutu 6 MB'dir. Eşzamansız Apex için gereken yığın boyutu iki katıdır ve bu da onu 12 MB yapar.
  6. Eşzamanlı Apex için izin verilen maksimum CPU süresi 10.000 milisaniye ve eşzamansız Apex için 60.000 milisaniyedir.
  7. Her iki Apex için de yürütme için yalnızca 10 dakikaya izin verilir.
  8. Her iki durumda da 100 alıcı ile sadece 10 sendEmail() yöntemini kullanabiliriz.
  9. Apex sınıfında veya Apex tetikleyicide bulunan karakterler 1 milyon içinde olmalıdır.
  10. Batch Apex'te (eşzamansız), boyut 200'dür. 'Veritabanı' sınıfının QueryLocator() işlemi, işlem başına 50 milyon kayıt döndürür.
  11. Yalnızca 5 Apex işi sırada veya etkin olacaktır.

LIMIT Sınıfı Örneği:

Apex, Governor limitlerini “LIMIT” sınıfında belirleyebilir. Bu sınıf, Governor sınırlarını söyleyen bazı yöntemler sağlar. Bazı Governor limitlerini gösteren aşağıdaki örneğe bakalım:





System.debug('İşlenebilecek toplam sorgu sayısı: '+ Limits.getLimitAggregateQueries());

System.debug('İşlenebilecek Web hizmeti bildirimi sayısı: '+ Limits.getLimitCallouts());

System.debug('İşlenebilecek kayıt sayısı: '+ Limits.getLimitDmlRows());

System.debug('DML deyimlerinin sayısı şöyle çağrılabilir: '+ Limits.getLimitDmlStatements());

System.debug('Bayt cinsinden toplam bellek miktarı: '+ Limits.getLimitHeapSize());

System.debug('Verilebilecek SOQL sorgusu sayısı: '+ Limits.getLimitQueries());

System.debug('Verilebilecek kayıt sayısı: '+ Limits.getLimitQueryRows());

System.debug('Yayınlanabilecek SOSL sorgularının sayısı:  ' + Limits.getLimitSoslQueries());

Çıktı:

'LIMIT' sınıfında bulunan 'dome' yöntemleri kullanılarak kaç DML ifadesinin/satırının döndürülebileceğini de kontrol etmek mümkün olabilir.



  1. Limits.getDMLStatements() bir örnekte kullanılan toplam DML deyimlerini döndürür.
  2. Limitler.getDMLRows() DML ifadeleri tarafından döndürülen toplam satır sayısını döndürür.
  3. Limitler.getCpuTime() geçerli işlem için kullanılan CPU süresini milisaniye cinsinden döndürür.

Kullanım Örneği:

“WorkOrder” nesnesinden iki kaydı döndüren bir SOQL sorgusu yazalım. Bundan sonra, 'delete' DML'yi kullanarak bu iki kaydı silin.

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

System.debug('Satırlar: '+Limits.getDmlRows());

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

// WorkOrder nesnesinden 2 satır seçmek için SOQL Sorgusu

List hesapları = [WorkOrder LIMIT 2'DEN Id SEÇ];

//İki satırı silmek için DML silmeyi kullanın

hesapları sil;

System.debug('**SOQL'den sonra:**');

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

System.debug('Satırlar: '+Limits.getDmlRows());

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

Çıktı:

Verilen örnekte DML deyimi yoktur ve 0 satır vardır. Mevcut CPU süresi 1 milisaniyedir. SOQL sorgusundan 2 satır döndürüp bu iki satırı sildikten sonra, Limits.getDMLStatements() tarafından döndürülen toplam DML ifadesi sayısı 1, Limits.getDMLRows() tarafından döndürülen toplam satır sayısı 2 ve CPU Bu işlemi gerçekleştirmek için gereken süre 51 milisaniyedir.

En İyi Uygulama Örneği:  'DÖNGÜ İÇİNDE DML'Yİ ASLA KULLANMAYIN'

Vali sınırını almadan kodu nasıl çalıştırabileceğimizi görelim. Önce 'WorkOrder' nesnesinden 'Product' nesnesi (API – Product2) üzerinde 'WorkOrder' konusunu 'Product Name' konusuna 'for' döngüsünün kendisinde atayarak bir kayıt oluşturuyoruz. Aşağıdaki kodu görelim:

Ürün2 ürün_nesnesi;

(WorkOrder wo_object : [WorkOrder'dan Konu SEÇ]) için

{

prod_obj = yeni Ürün2(Ad = wo_object.Subject);

prod_obj'u ekle;

}

Bunu bir liste (prod_s) bildirerek ve ardından prod_obj'yi listede saklayarak daha iyi bir şekilde yapabiliriz. Bu listeyi döngünün dışındaki ürüne ekleyebiliriz.

List prod_s = new List();

Ürün2 ürün_nesnesi;

(WorkOrder wo_object : [WorkOrder'dan Konu SEÇ]) için

{

prod_obj = yeni Ürün2(Ad = wo_object.Subject);

prod_s.add(prod_obj);

}

prod_obj'u ekle;

Çözüm

Artık Salesforce'ta Apex limitlerinin ne olduğunu detaylı bir anlatımla öğrenmiş olduk. Eşzamanlı Apex ile karşılaştırıldığında daha iyi Governor limitleri elde etmek için Asenkron Apex sürecini kullanmak daha iyidir. Farklı senaryolar için Governor limitlerini de öğrendik ve “Limit” sınıfından limit sayımı ile ilgili örnek bir gösteri yaptık. Ayrıca bir DML deyimi çalıştırarak DML deyimlerinin, satırlarının ve CPU süresinin sayısını doğruladık. Bir en iyi uygulama örneğini tartışarak bu kılavuzu sonlandırdık.