26 Temmuz 2012 Perşembe

Hibernate Birincil Önbellek

Birincil Önbellek
Birincil önbellek session ile ilişkilendirilir ve session kapatılınca yok olur. İkincil önbellek ise SessionFactory ile ilişkilendirilir ve SessionFactory kapatılınca yok olur.

Birincil önbelleğin Session ile ilişkili olduğunu gösteren şekli buradan aldım.

Bir diğer şekli ise buradan aldım.

Birincil önbellek bir nesneye arka arkaya birkaç güncelleme gelirse her seferinde veritabanına gitmeden SQL cümlelerini mümkün olduğunca geciktirebilmeye yarar. Eğer session kapatılırsa önbellek te beraberinde kapatılır. Birincil önbellek ile ilgili kurallar aşağıda.

Session.flush() –>  Flushes level one cache content to db software
Session.evict() –> Remove the content of level 1 cache
Session.close() –> closes level 1 cache, before that it calls session.flush()

Batch Processing
Birincil önbellek batch işlemlerde bazen OutOfMemoryException problemine sebep olabilyor. Bunun sebebi ve nasıl çözüleceği "Batch Processing" sayfasında anlatılmış. Ben de aşağıya bazı notlarımı ekliyorum.

Batch Update
Aşağıdaki kod parçasında da görüldüğü gibi openSession() metodu ile elde edilen Session nesnesi, birincil önbellek ile ilişkili ve bu nesne ile yapılan save(),update() vs. gibi işlemlerde parametre olarak geçilen nesne önbelleğe dahil ediliyor. Ancak çok fazla sayıda işlem yapılırsa önbellek şiştiği için OutofMemoryError hatası alabiliyoruz.


Bu durumdan kurtulmak için iki yol var. Birinci yöntemde önbellek ara sıra temizleniyor. Aşağıdaki kodda önbellek her 20 döngüde bir temizleniyor.
İkinci yöntemde ise önbellek hiç kullanılmıyor. Birinci koddan farklı olarak bu sefer openStatelessSession() metodunun çağırıldığına dikkat !
Batch Select
Batch select için örnek Managing the caches başlığı altında verilmiş.
Birincil Önbellek ve load
When does Hibernate Session.load() throw an exception sorusunda load() metodunun bir nesnenin veritabanında olup olmadığını kontrol etmek için kullanılmaması gerektiği açıklanmış.

Hiç yorum yok:

Yorum Gönder