Yanıtlar:
1.1) Birinci seviye önbellek
Birinci düzey önbellek her zaman Oturum nesnesiyle ilişkilendirilir . Hazırda Bekletme varsayılan olarak bu önbelleği kullanır. Burada, bir işlemi birbiri ardına işler, bir işlemi birçok kez işlemeyecektir. Temelde, belirli bir işlemde oluşturması gereken SQL sorgularının sayısını azaltır. Bu, işlemde yapılan her değişiklikten sonra güncelleme yapmak yerine, işlemi yalnızca işlemin sonunda günceller.
1.2) İkinci seviye önbellek
İkinci düzey önbellek her zaman Session Factory nesnesiyle ilişkilendirilir . İşlemleri çalıştırırken, aralarında nesneleri Oturum Fabrikası düzeyinde yükler, böylece bu nesneler tek bir kullanıcıya bağlı olmayan tüm uygulama için kullanılabilir olur. Nesneler önbelleğe zaten yüklendiğinden, bir nesne sorgu tarafından döndürüldüğünde, o zaman bir veritabanı işlemi için gitmeye gerek yoktur. Bu şekilde ikinci seviye önbellek çalışır. Burada sorgu düzeyinde önbellek de kullanabiliriz.
Alıntı sahibi: http://javabeat.net/introduction-to-hibernate-caching/
Streamline Logic blogunda ilk düzey önbelleğe almanın oldukça iyi bir açıklaması var .
Temel olarak, birinci düzey önbellekleme, oturum başına esasında gerçekleşir; burada, ikinci düzey önbellekleme birden çok oturumda paylaşılabilir.
İşte hazırda bekleme önbelleğinin bazı temel açıklamaları ...
Birinci düzey önbellek “session” nesnesiyle ilişkilendirilir. Önbellek nesnelerinin kapsamı oturum halindedir. Oturum kapatıldıktan sonra, önbelleğe alınan nesneler sonsuza kadar yok olur. Birinci düzey önbellek varsayılan olarak etkindir ve devre dışı bırakamazsınız. Bir varlığı ilk kez sorguladığımızda, veritabanından alınır ve hazırda bekletme oturumuyla ilişkili ilk düzey önbellekte depolanır. Aynı nesneyi aynı oturum nesnesiyle tekrar sorgularsak, önbellekten yüklenir ve sql sorgusu yürütülmez. Yüklenen varlık, evict()
yöntem kullanılarak oturumdan kaldırılabilir . Bu varlığın bir sonraki yüklemesi, evict()
yöntem kullanılarak kaldırılmışsa, yine veritabanı çağrısı yapar . Tüm oturum önbelleği clear()
yöntem kullanılarak kaldırılabilir . Önbellekte depolanan tüm varlıkları kaldırır.
İkinci seviye önbellek, oturum fabrika kapsamında global olarak kullanılabilen birinci seviye önbellekten ayrıdır. ikinci düzey önbellek, oturum fabrikası kapsamında oluşturulur ve söz konusu oturum fabrikası kullanılarak oluşturulan tüm oturumlarda kullanılabilir. Ayrıca, oturum fabrikası kapatıldıktan sonra, onunla ilişkili tüm önbellek ölür ve önbellek yöneticisi de kapatılır. Hazırda bekletme oturumu bir varlığı yüklemeye çalıştığında, varlığın ilk yeri ilk düzey önbellekte (belirli hazırda bekletme oturumuyla ilişkilendirilir) önbelleğe alınmış kopyasını arar. Varlığın önbelleğe alınmış bir kopyası birinci düzey önbellekte varsa, yükleme yöntemi sonucunda döndürülür. Birinci düzey önbellekte önbelleğe alınmış varlık yoksa, önbellekteki varlık için ikinci düzey önbellek aranır. İkinci düzey önbellek varlığı önbelleğe almışsa, yükleme yöntemi sonucunda döndürülür. Fakat, varlığı iade etmeden önce, ilk düzey önbellekte de saklanır, böylece varlık için bir sonraki yükleme yönteminin çağrılması, varlığı birinci düzey önbellekten kendisi döndürür ve ikinci düzey önbelleğe gitmeye gerek kalmaz. Varlık birinci düzey önbellekte ve ikinci düzey önbellekte de bulunamazsa, veritabanı sorgusu yürütülür ve varlık, yanıt olarak dönmeden önce her iki önbellek düzeyinde depolanırload()
yöntem.
Bu çok yaygın bir soru, bu yüzden bu cevap blogumda yazdığım bu makaleye dayanıyor .
Hazırda Bekletme, Sebat Bağlamını mümkün olan en son ana kadar yıkmayı ertelemeye çalışır. Bu makalede açıkladığım gibi , bu strateji geleneksel olarak işlemsel geri yazma olarak biliniyordu.
Arkaya yazma, herhangi bir mantıksal veya fiziksel işlemden çok Hazırda Bekletme ile ilgilidir. Bir işlem sırasında, yıkama birkaç kez oluşabilir.
Temizlenen değişiklikler yalnızca geçerli veritabanı işlemi için görülebilir. Mevcut işlem tamamlanana kadar, eşzamanlı diğer işlemler tarafından hiçbir değişiklik görünmez.
Birinci düzey önbellek nedeniyle, Hazırda Beklet birkaç optimizasyon yapabilir:
Uygun bir önbellekleme çözümünün birden fazla Hazırda Bekletme Oturumuna yayılması gerekir ve bu nedenle Hazırda Beklet ek bir ikinci düzey önbelleği de destekler.
İkinci düzey önbellek SessionFactory yaşam döngüsüne bağlıdır, bu nedenle yalnızca SessionFactory
kapatıldığında (genellikle uygulama kapatıldığında) yok edilir. İkinci düzey önbellek, isteğe bağlı bir sorgu önbellekleme çözümünü de desteklese de, öncelikle varlık tabanlıdır.
Daha fazla ayrıntı için bu makaleye göz atın .
Varsayılan olarak, NHibernate, Oturum Nesnesi tabanlı olan ilk düzey önbelleğe alma özelliğini kullanır. ancak çok sunuculu bir ortamda çalışıyorsanız, birinci düzey önbellek bazı performans sorunlarıyla birlikte çok ölçeklenebilir olmayabilir. veri birden çok sunucuya dağıtıldığı için veritabanına sık sık geziler yapması gerektiği için olur. başka bir deyişle NHibernate temel, çok karmaşık olmayan bir işlem içi L1 önbellek sağlar. Ancak, bir önbellekleme çözümünün uygulama performansı üzerinde önemli bir etkisi olması gereken özellikler sağlamaz.
tüm bu sorunun soruları oturum fabrika nesneleri ile ilişkili bir L2 önbellek kullanımıdır. veritabanına yapılan yolculukları azaltır, dolayısıyla uygulama yanıt süresini artırır.
Birinci Seviye Önbellek
Oturum nesnesi ilk düzey önbellek verilerini tutar. Varsayılan olarak etkindir. İlk düzey önbellek verileri tüm uygulama için kullanılamayacak. Bir uygulama birçok oturum nesnesini kullanabilir.
İkinci Seviye Önbellek
SessionFactory nesnesi ikinci düzey önbellek verilerini tutar. İkinci seviye önbellekte saklanan veriler tüm uygulama için kullanılabilir olacaktır. Ancak bunu açıkça etkinleştirmemiz gerekiyor.
İkinci düzey bir önbellekte, etki alanı hbm dosyaları anahtar değiştirilebilir ve false değerine sahip olabilir. Örneğin, bu etki alanı sınıfında bir gün içindeki sürenin bir kısmı evrensel gerçek olarak sabit kalır. Böylece, uygulama boyunca değişmez olarak işaretlenebilir.