Hizmet katmanındaki nesneleri önbelleğe almak için yay önbelleği soyutlamasını kullanıyorum. aşağıdaki Bu basit get/satım işlemleri için ince gibidir:Yay önbelleği soyutlamasını kullanarak giriş sayısı nasıl döndürür
static private final String cacheName = "messages";
@CacheEvict(value=cacheName, key="#message.id")
public void deleteMessage(Message message) {
...
}
@Cacheable(value=cacheName, key="#id")
public Message findMessage(Long id) {
...
}
@CachePut(value=cacheName, key="#message.id")
public void saveMessage(Message message) {
...
}
@CachePut(value=cacheName, key="#message.id")
public Message updateMessage(Message message) {
...
}
Ancak, aşağıdaki yöntemi için kullanacağı açıklama:
public long countAllMessages() {
...
}
tüm nesnelerin önbellekte olacağından
, cevabı önbellekten almanın ve depo katmanına gitmemenin bir yolu olmalı.@Cacheable(cacheName)
public List<Message> findAllMessages() {
...
}
Ben sayım yöntemi bu gibi tüm yöntemini bulmak çağırmak yapabiliriz:
Ayrıca, önbellek aşağıdaki yöntemi uygulanıyor
public long countAllMessages() {
return findAllMessages().size();
}
Ama bu verimli olmaz Önbellek devre dışı bırakıldığında, çağrı daha sonra tüm kayıtları db yerine SELECT COUNT (*) ...
Ve ilk kez countAllMessages() çağrıldığından, önbelleğe vurmadığından nasıl emin olurum? – Solubris
countAllMessages() sürümünüzü çağırmak yerine, getTotalEhCacheSize() yöntemini çağırır veya kodu getTotalEhCacheSize() içinden countAllMessages() içine alırsınız. Veritabanından gerçek bir sayıya ihtiyacınız varsa (ya da herhangi bir arka uçta), bunu yapmak için özel bir yönteme ihtiyacınız olacaktır, bunu yapmak için @Cacheable notu (eğer isterseniz) ek açıklamada bulunabilirsiniz. Herhangi bir zamanda yenilemesini isterseniz, başka bir güncelleştirme yöntemini çağırdığınızda yöntemlerin önbelleğini boşaltın veya örneğin bir arka plan işiyle manuel olarak tahliye edin. –