2012-12-26 6 views
5

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 (*) ...

cevap

9

İlkbahar önbelleği soyutlaması şu anda yüklemiyor Altta yatan önbelleklere ilişkin istatistiklere doğrudan erişim yolunu keser. Örneğin, tüm önbelleklerin boyutunu, önbelleğe alınan nesnelerin anahtarlarını, vb. Almanın doğrudan bir yolu yoktur. Bu, daha yüksek seviyeli bir soyutlamadır. Bununla birlikte, Cache#getNativeCache() yöntemiyle temel yerel önbellek sınıflarına erişebilirsiniz. CacheManager sınıfından bir Cache örneğini yakaladığınızda bu yönteme erişebilirsiniz. CacheManager tarafından yönetilen Önbellek örneklerinin temel türlerini bildiğinizi varsayarsak, bunları uygun türlere atayabilir ve her birinde yardımcı yöntemlere erişebilirsiniz (varsayarak varsa). Örneğin, temel önbellek deponuz EHCache ise, CacheManager#getCache("messages") numaralı telefonu arayarak "iletiler" adlı Önbellek örneğini alabilirsiniz. Ardından, türünü kontrol edip türünü net.sf.ehcache.Ehcache türüne çevirebilirsiniz, böylece çeşitli istatistik yardımcı yöntemlerini kullanabilirsiniz (örn. getStatistics()).

Burada, CacheManager tarafından yönetilen tüm önbelleklerden geçerek, net.sf.ehcache.Ehcache türüne sahip olup olmadıklarını denetleme ve daha sonra istatistiklerini alma örneklerini görebilirsiniz.

public class EhCacheStatistics { 
    private CacheManager cacheManager; 

    @Inject 
    public void setCacheManager(CacheManager cacheManager) { 
    this.cacheManager = cacheManager; 
    } 

    public long getTotalEhCacheSize() { 
    long totalSize = 0l; 
    for (String cacheName : cacheManager.getCacheNames()) { 
     Cache cache = cacheManager.getCache(cacheName); 
     Object nativeCache = cache.getNativeCache(); 
     if (nativeCache instanceof net.sf.ehcache.Ehcache) { 
     net.sf.ehcache.Ehcache ehCache = (net.sf.ehcache.Ehcache) nativeCache; 
     totalSize += ehCache.getStatistics().getObjectCount(); 
     } 
    } 
    return totalSize; 
    } 
} 
+0

Ve ilk kez countAllMessages() çağrıldığından, önbelleğe vurmadığından nasıl emin olurum? – Solubris

+0

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. –

İlgili konular