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:
- 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>
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
- Ö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 { // ... }
- (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>
- Ö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ı:
- 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)
- 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)
- 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)
- 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)
- 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.