İkincil Önbellek
İkincil önbellek ile ilgili data detaylı bilgiyi
burada bulabilirsiniz.
İkinci önbellek aslında 4 kısımdan
oluşuyor. Bunlar entity, collection, query ve timestamp kısımları. Hibernate ikincil öbelleği kullanmak üzere ayarlanırsa bu alanları otomatik olarak oluşturuyor ancak bu alanlara ne kadar bellek ayırılacağı vs. gibi ince detaylar önbellek kütüphanesinin konfigürasyon dosyasında yapılıyor. Örneği
burada görebilirsiniz.
İkincil Önbellek Hibernate Sessionları Arasında Ortak Kullanılır
Aşağıdaki şekli
buradan aldım ve farklı Hibernate sessionları arasında önbelleğin ortak kullanıldığını görmek mümkün.
Hemen hemen aynı şeyi gösteren bir başka şekil ise
buradan geldi.
İkincil Önbelleği Etkinleştirme Ayarları
İkincil önbelleği konfigüre etmek için gereken ayarları gösteren kısmı
buradan aldım.
<property name="hibernate.cache.use_second_level_cache">
true</property>
<property name="hibernate.cache.use_query_cache">
true</property>
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider</property>
1. Entity Önbellek Ayarları
En kolay yöntem annotation kullanmak. Hibernate annotationları kullanılmak istenirse
@Cache kullanılıyor. Eğer JPA annotation kullanılmak istenirse
@Cacheable kullanılıyor.
Not : Entity Önbellekte entity'nin primary key değeri arama anahtarı olarak kullanılıyor
Eğer entity'ler InheritanceType.TABLE_PER_CLASS stratejisini kullanıyorsa @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) tag'ini en alttaki sınıfa eklemek gerekiyor.
Yoksa aşağıdaki şekilde de görüldüğü gibi Hibernate accessStrategy sınıfını bulamıyor ve entity ikincil önbelleği kullanamıyor
İkincil Önbellek Stratejileri
Bu konuyla ilgili fazla bilgi bulamadım. Kullanılabilecek stratejiler aşağıda.
NONE :
READ_ONLY : Eğer nesneler hiç değişmiyorsa, değeri hep sabit ise kullanılır
NONSTRICT_READ_WRITE : Çok nadiren değişen nesneler için kullanılır. Eşzamanlı güncellemeler için önbellekte lock mekanizması kullanmaz. Dolayısıyla önbellekten dönen sonucun her zaman en son güncellenen değer olduğunu garanti
etmez!
READ_WRITE : En çok kullanılan yöntem.
TRANSACTIONAL : Sadece XA transaction yöneticisi varsa bu seçenek kullanılabilir
İkincil Önbellek Boşaltma Yöntemleri
İkincil önbellek boşaltılması ile ilgili kurallar aşağıda.
sessionFactory.close() –> Destroys the session factory object and releases level 2 cache.
sessionFactory.evict(arga …) –> Removes pojo class object from session factory.
sessionFactory.evictQueries(args…) –> Cleans queries related data from cache.
Evict örneklerini gösteren bir kodu
buradan aldım.
İkinci kademe önbellekte entitiy kısmında arama yapılmasını anlatan örneği
buradan aldım.
2. Sorgu Önbellek Ayarları
Sorgu önbelleğinin neden aslında zararlı olabileceği ise
burada anlatılıyor. Sorgu önbelleği çalışma akışı ise aşağıda.
Not : Sorgu Önbellekte anahtar olarak sorgunun kendisi ve sorguya verilen parametreler arama anahtarı kullanılıyor
Sorgu Önbelleği Tabloların Değişip Değişmediğini Nasıl Anlıyor?
Buradaki soruda da anlatıldığı gibi sorgu çalıştırılmadan önce sorguyu ilgilendiren tabloların UpdateTimestampsCache önbelleğindeki en son güncellenme zamanına bakılıyor. Eğer tablolar önbellekteki sorgu sonucundan sonra güncellenmişse, sorgu tekrar çalıştırılıyor.