Eşzamanlılık Stratejileri
Hibernate'de ikinci düzey önbelleğe almayı etkinleştirdikten sonra, Hibernate'e hangi Entity nesnelerini nasıl önbelleğe almak istediğimizi açıklamanız gerekir.
Bunu yapmak için Hibernate'in Entity sınıfları için özel bir ek açıklaması vardır - @Cache . Örnek:
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
Bu ek açıklamanın, ikinci düzey önbelleği kullanmak istediğimiz her Varlık varlığı için yazılması gerekir. Örnek:
@Entity
@Table(name = "employee")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
@Id
private Integer id;
private Set<Task> tasks;
}
Hibernate, farklı iş parçacığından erişiliyorsa, önbelleğe alınmış bir varlık için 4 olası erişim stratejisine sahiptir:
- Sadece oku
- okuma yazma
- katı olmayan okuma yazma
- işlemsel
Salt okunur. Hiçbir zaman değişmeyen, verilere uygun bir eşzamanlılık stratejisi. Hazırda Bekletme, bu nesneleri belleğinde saklayacaktır. Yalnızca referans verileri için kullanın.
Veritabanları asla değişmeyen birçok bilgiyi depolar. Örneğin, bir tablo yalnızca eklenen ancak hiçbir zaman değiştirilmeyen veya kaldırılmayan olayların bir listesini tutar. Hazırda Bekletme aracılığıyla bu tabloyla çalışmanız gerekiyorsa, salt okunur önbelleğe alma stratejisi size uyacaktır.
Okuma-yazma (okuma-yazma). Öncelikle okunabilir olan veriler için bu stratejiyi kullanın. Ancak Hazırda Beklet, çok seyrek olmalarını beklemesine rağmen bu verileri değiştirme girişimlerini izleyecektir.
Esas olarak nadiren değişen ve sıklıkla okunan / talep edilen nesneleri önbelleğe almanız gerekir. Bu tür nesneleriniz varsa, onlar için okuma-yazma stratejisini kullanmanız gerekir.
Katı olmayan okuma-yazma . Bu strateji, önbellek ile veritabanı arasında tutarlılığı garanti etmez. Veriler neredeyse hiç değişmiyorsa ve küçük bir eskimiş veri olasılığı kritik bir sorun değilse bu stratejiyi kullanın.
Okuma-yazma stratejisinden farklı olarak, bu strateji değişken verilerin okuma için kilitli olmadığını varsayar. Bu, nesnenin bir yerde değiştirilmesine neden olurken, başka bir yerde birisi onun eski sürümünü okuyor.
Örneğin, bir kullanıcı yorumunu değiştirmiştir, ancak diğer kullanıcılar bir süreliğine onun eski halini görmeye devam etmektedir. Bu sizin için bir sorun değilse, katı olmayan okuma-yazma stratejisini kullanın.
işlemsel . Bu stratejiyi, nadir bir güncelleme durumunda eşzamanlı işlemlerde eski verileri önlemenin önemli olduğu, öncelikli olarak salt okunur veriler için kullanın.
Verileri önbellekte depolama
İkinci düzey önbellekle ilgili hatırlamanız gereken bir diğer önemli ayrıntı da Hibernate'in sınıflarınızın nesnelerini kendi başına saklamamasıdır. Bilgileri diziler, sayılar vb. olarak depolar.
Ve nesne tanımlayıcısı, bu bilgilere bir işaretçi görevi görür. Kavramsal olarak, bu, nesnenin kimliğinin anahtar olduğu ve veri dizilerinin değer olduğu bir Harita gibi bir şeydir. Bunu şöyle hayal edebilirsiniz:
1 -> { "Ivanov", 1, null , {1,2,5} }
2 -> { "Petrov", 2, null , {1,2,5} }
3 -> { "Sidorov", 3, null , {1,2,5} }
Her nesnenin ne kadar ekstra bellek kapladığı düşünüldüğünde bu çok makul.
Yukarıdakilere ek olarak, Entity sınıfınızın bağımlılıklarının da varsayılan olarak önbelleğe alınmadığını unutmamalısınız. Örneğin, yukarıdaki Çalışan sınıfını ele alırsak , getirme sırasında görevler koleksiyonu ikinci düzey önbellekten değil , veritabanından alınır .
Bağımlılıkları da önbelleğe almak istiyorsanız, sınıf şöyle görünmelidir:
@Entity
@Table(name = "employee")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
@Id
private Integer id;
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private Set<Task> tasks;
}
Ve son ayrıntı - ikinci seviye önbellekten okuma, yalnızca istenen nesne birinci seviye önbellekte bulunamadıysa gerçekleşir.
Önbellek Modu
Hazırda bekletme, çok esnek önbelleğe alma yönetimi sağlar. Önbellek modunu her bir bireysel oturum için ve hatta her bir veritabanı isteği için ayarlayabilirsiniz.
Bu tür beş mod vardır:
- ELDE ETMEK
- GÖRMEZDEN GELMEK
- NORMAL
- KOYMAK
- YENİLE
Aşağıdaki tablo çalışmalarını açıklamaktadır:
Önbellek Modu | Tanım |
---|---|
ELDE ETMEK | Veriler önbellekten okunur ancak önbelleğe eklenmez. |
GÖRMEZDEN GELMEK | Oturum, önbellek ile etkileşime girmez. |
NORMAL | Veriler önbellekten okunur ve buna eklenir. |
KOYMAK | Veriler hiçbir zaman önbellekten alınmaz, önbelleğe eklenir. |
YENİLE | Veriler hiçbir zaman önbellekten alınmaz, önbelleğe eklenir. Bu modda ayrıca hibernate.cache.use_minimal_puts ayarı kullanılır. |
Bir oturum için önbellek modunu ayarlama örneği:
session.setCacheMode(CacheMode.GET);
Employee director = session.createQuery("from Employee where id = 4").uniqueResult();
Ayrıca oturum ve istek için modu ayarlamaya bir örnek:
session.setCacheMode(CacheMode.GET);
Query query = session.createQuery("from Employee where id = 4");
query.setCacheMode(CacheMode.IGNORE); // Ignore cache work for this request
Employee director = query.uniqueResult();