Hibernate İkinci Seviye Önbellek ve Spring Boot Implementasyonu. CacheConcurrencyStrategy Çeşitleri ve Açıklamaları



Hibernate İkinci Seviye Önbellek Nedir?

Hibernate ikinci seviye önbellek, veritabanı sorguları sonucunda elde edilen verilerin JVM seviyesinde saklanmasını sağlayan bir mekanizmadır. Bu, aynı sorguların tekrar tekrar veritabanına gönderilmesini önleyerek performansı artırır.

Özellikleri:

  • Tüm session'lar arasında paylaşılır
  • Uygulama seviyesinde çalışır
  • Veritabanı yükünü azaltır
  • Sorgu sonuçlarını bellekte tutar

Spring Boot'ta Hibernate İkinci Seviye Önbellek Implementasyonu

Spring Boot'ta Hibernate ikinci seviye önbelleği implement etmek için aşağıdaki adımları izleyebilirsiniz:

  1. Bağımlılıkları ekleyin (Maven örneği):

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> </dependency>
  1. application.properties dosyasında önbelleği aktifleştirin:

spring.jpa.properties.hibernate.cache.use_second_level_cache=true spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory spring.jpa.properties.javax.persistence.sharedCache.mode=ENABLE_SELECTIVE
  1. Önbelleğe alınacak entity'leri işaretleyin:

import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; @Entity @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class User { // ... }
  1. (Opsiyonel) Özel önbellek ayarları için ehcache.xml dosyası oluşturun:

<ehcache> <defaultCache maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false" diskPersistent="false" memoryStoreEvictionPolicy="LRU"/> <cache name="com.example.User" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="false" diskPersistent="false" memoryStoreEvictionPolicy="LRU"/> </ehcache>
  1. Önbelleği kullanmak için repository metotlarında @Cacheable anotasyonunu kullanın:

import org.springframework.cache.annotation.Cacheable; @Repository public interface UserRepository extends JpaRepository<User, Long> { @Cacheable("users") User findByUsername(String username); }

Bu adımları takip ederek, Spring Boot uygulamanızda Hibernate ikinci seviye önbelleği başarıyla implemente edebilirsiniz.


CacheConcurrencyStrategy Çeşitleri ve Açıklamaları

Hibernate'te @Cache anotasyonu ile kullanılan CacheConcurrencyStrategy, önbelleğe alınan verilerin nasıl yönetileceğini belirler. İşte farklı stratejiler ve açıklamaları:

  1. READ_ONLY
    • Sadece okunabilen veriler için kullanılır.
    • En yüksek performansı sağlar.
    • Veriler asla değişmeyecekse kullanılmalıdır (örn. referans tabloları).
    • Örnek: @Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
  2. NONSTRICT_READ_WRITE
    • Nadiren güncellenen veriler için uygundur.
    • Eşzamanlı güncellemelerde tutarsızlık riski vardır.
    • Performans ile tutarlılık arasında denge sağlar.
    • Örnek: @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
  3. READ_WRITE
    • Sık okunan ama nadiren güncellenen veriler için idealdir.
    • Soft lock mekanizması kullanarak tutarlılığı sağlar.
    • NONSTRICT_READ_WRITE'dan daha yavaş ama daha tutarlıdır.
    • Örnek: @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
  4. TRANSACTIONAL
    • JTA destekli ortamlarda kullanılır.
    • Tam ACID uyumluluğu sağlar.
    • En yüksek tutarlılık seviyesini sunar, ancak performans maliyeti vardır.
    • Örnek: @Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
  5. NONE
    • İkinci seviye önbelleği devre dışı bırakır.
    • Belirli bir entity için önbelleği kapatmak istediğinizde kullanılır.
    • Örnek: @Cache(usage = CacheConcurrencyStrategy.NONE)

Strateji seçimi, uygulamanızın ihtiyaçlarına, veri erişim paternlerine ve tutarlılık gereksinimlerine bağlıdır. Örneğin:

@Entity @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class Product { // ... } @Entity @Cache(usage = CacheConcurrencyStrategy.READ_ONLY) public class Category { // ... }

Bu örnekte, Product entity'si sık okunup nadiren güncellendiği için READ_WRITE stratejisi kullanılırken, Category entity'si değişmeyeceği varsayılarak READ_ONLY olarak işaretlenmiştir.

Doğru stratejiyi seçmek, uygulamanızın performansını ve veri tutarlılığını optimize etmenize yardımcı olacaktır.

Please Select Embedded Mode To Show The Comment System.*

Daha yeni Daha eski

نموذج الاتصال