önbelleğe alma ayarı

Hibernate.cfg.xml dosyasındaki önbellek ayarlarımıza geri dönelim:

<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletEhCacheProvider"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>

İlk satıra dikkat edin - önbelleğe alma motoru sınıfının adını içerir. Hazırda Bekletme aslında önbelleğe almayı dahili olarak uygulamaz, bunun yerine kendi önbelleğe alma motorunuzu uygulayabileceğiniz bir dizi arabirim sağlar.

Popüler uygulamalar şunları içerir:

  • EHCache
  • OSCache
  • Sürü Önbelleği
  • JBoss TreeCache

EHCache

Bellekte veya diskte ve ayrıca küme önbelleğinde önbelleğe alınabilir ve ayrıca isteğe bağlı bir Hazırda bekletme sorgu sonuçları önbelleğini destekler.

OSCache

Zengin bir süre sonu ilkeleri seti ve sorgu önbelleği desteği ile aynı JVM'de bellek ve disk önbelleğe almayı destekler.

Sürü Önbelleği

JGroups tabanlı küme önbelleği. Kümelenmiş geçersiz kılma kullanır ancak Hazırda Beklet sorgu önbelleğini desteklemez.

JBoss Önbelleği

Yine JGroups çok noktaya yayın kitaplığını temel alan, tamamen işlemsel olarak çoğaltılmış bir kümelenmiş önbellek. Çoğaltmayı veya geçersiz kılmayı, eşzamanlı veya eşzamansız iletişimi ve iyimser ve kötümser kilitlemeyi destekler. Hazırda bekletme sorgu önbelleği desteklenir.

Bu motorlar tüm paralel erişim stratejilerini desteklemez. Gerçek durum aşağıdaki tabloda açıklanmıştır:

Strateji/Sağlayıcı Sadece oku katı olmayan okuma yazma okuma yazma işlemsel
EHCache X X X
OSCache X X X
Sürü Önbelleği X X
JBoss Önbelleği X X

EHCache yapılandırma örneği

EHCache motorunun ehcache.xml adlı kendi yapılandırma dosyası vardır. Böyle bir dosyanın yaklaşık içeriği:

<diskStore path="java.io.tmpdir"/>

<defaultCache
    maxElementsInMemory = "1000"
    eternal = "false"
    timeToIdleSeconds = "120"
    timeToLiveSeconds = "120"
    overflowToDisk = "true"
/>

<cache name = "Employee"
    maxElementsInMemory = "500"
    eternal = "true"
    timeToIdleSeconds = "0"
    timeToLiveSeconds = "0"
    overflowToDisk = "false"
/>

Burada önbelleğe alma ayarlarını hem genel olarak hem de her varlık için ayrı ayrı yapılandırabilirsiniz. Resmi belgelerde daha fazlasını okuyun .

Önbelleğe alma istatistiklerinin analizi

Önbelleğe alma mekanizmasının ne kadar iyi yapılandırıldığını da kontrol etmeniz gerekebilir. Hibernate, özellikle bunun için özel bir İstatistik nesnesi sağlar.

Örnek:

Statistics statistics = session.getSessionFactory().getStatistics();
CacheRegionStatistics cacheStatistics = statistics.getDomainRegionStatistics(“com.codegym.employee”);

long hitCount = cacheStatistics.getHitCount();
long missCount = cacheStatistics.getMissCount();
double hitRatio = (double) hitCount / (hitCount + missCount);

Bu konuda ayrıntıya girmeyeceğiz çünkü standart önbelleğe alma çözümlerinizin bitmesi ve bunları manuel olarak iyileştirmeniz gerekmesi daha uzun yıllar alacak. Bu arada, bu yorum benzer bir davadan alınmış olabilir:

// Dear programmer:
// When you're done "optimizing" this routine
// and realize how big of a mistake it was to do this,
// please increment the counter at the bottom as a warning
// for the next guy:
// number_of_hours_spent_here = 42