Hazırda Bekletme'deki Birinci ve İkinci Düzey önbellekler nelerdir?


245

Hazırda Bekletme'de Birinci ve İkinci Düzey önbelleklemenin ne olduğunu basit bir şekilde açıklayabilir misiniz?

Yanıtlar:


300

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/


38
Oturum Nesnesi ile Birinci Düzey Önbellek ve Oturum Fabrika Nesnesi ile İkinci Düzey Önbellek eşleme için +1. okumaya devam etmeme bile gerek yok.
Mahes

1
1. seviye önbellek. çoğu durumda gerekli değildir, ancak ondan kurtulma seçeneği yoktur. ama her zaman düşünmelisin ..
ses

6
@ses Çoğu durumda 1. seviye önbellek gerekir. Aksi takdirde, N + 1 sorgusu gibi çok KÖTÜ PERFORMANS probleminiz olacaktır veya bir özniteliğe her eriştiğinizde önceden istekli önbellek veya sorgu yoktur.
Dennis C

Genellikle oturumu çok kısa bir süre için kullanırız (ve çok vücut bunu tavsiye eder) / kısa süreli oturumu kullanırız: bu önbelleği o dönemde bile kullanmayız. oturumun uzun ömürlü olması durumunda, verileri oturumdan kaldırırız (örneğin formu düzenlerken). Uzun ömürlü oturum için bazı karmaşık istek-istek isteği oluştururken, query-session-api kullanmaya çalışırken sadece bir senaryo için gerekli görünüyor.
ses

1
@DennisCheung: Bağlantı öldü. Lütfen javabeat.net/introduction-to-hibernate-caching
NewUser

118

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.


20
İşte bu basit kelimeler, neden açıklamak için bu kadar zor zamanlar olduğunu bilmiyorum
BlackTigerX

hehe ... evet nasıl daha basit kazanılmış olabilir gerçekten bilmiyorum :)
lomaxx

2
bu aslında benim için daha açık. Birincisi, oturum başına ikincisi çoklu oturum için, aklımda tutmak benim için basit. iki kez oy kullanamaz mıyız? : D
black sensei

1
1. seviye önbelleğe neden ihtiyaç duyulduğunu gösteren bir örnek yok. benim için çoğu durumda buna hiç gerek yok. ama bunu ve oturumu her zaman düşünmelisiniz.
ses

Bu cevaptan bu yana geçen 11 yıl ve maalesef bağlantı şu anda mevcut değil. Ancak içeriğini arşiv web sayfasında buldum: web.archive.org/web/20081207044228/http://…
Golu

105

İş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.


2
Mükemmel açıklama! Bazı dizi diyagramları çizebilirseniz harika olacak !!!
Adelin

ayrıntılı ve güzel açıklama
ManishS

1
Bildiklerinizi gözden geçirmek istiyorsanız, Dennis C ve Iomaxx'ın yukarıdaki iki yanıtı harika, çok özlü ve hatırlaması kolaydır. Bununla birlikte, daha önce bilmediğiniz farkın bir açıklamasını arıyorsanız, bu cevap çok daha iyidir!
Öğrenci Ruhu

Büyük açıklama !!
blu3

17

Bu çok yaygın bir soru, bu yüzden bu cevap blogumda yazdığım bu makaleye dayanıyor .

Birinci seviye önbellek

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.

resim açıklamasını buraya girin

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:

İkinci seviye önbellek

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 SessionFactorykapatı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 .


3

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.


1

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.


-4

İ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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.