2012-12-26 4 views
5

Używam abstrakcji pamięci podręcznej sprężyny do buforowania obiektów w warstwie usługi. Jest to dobre rozwiązanie dla prostych operacji get/put, co następuje:Jak zwrócić liczbę wpisów za pomocą abstrakcji z pamięci podręcznej sprężyny

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) { 
... 
} 

Jednak to, co adnotacji Chciałbym skorzystać z następujących metod:

public long countAllMessages() { 
... 
} 

Ponieważ wszystkie obiekty będą w pamięci podręcznej, powinien istnieć sposób na uzyskanie odpowiedzi z pamięci podręcznej i bez konieczności przechodzenia do warstwy repozytorium.

Również pamięć podręczna jest stosowana w następujący sposób:

@Cacheable(cacheName) 
public List<Message> findAllMessages() { 
... 
} 

mogłem zrobić metoda zliczania nazywają znaleźć wszystkie metody takie jak to:

public long countAllMessages() { 
    return findAllMessages().size(); 
} 

Ale to nie byłby skuteczny w przypadku, gdy pamięć podręczna jest wyłączone, a rozmowa będzie następnie załadować wszystkie rekordy z db zamiast robić SELECT COUNT (*) ...

Odpowiedz

9

The Spring cache abstrakcji obecnie nie pr udostępnić bezpośredni sposób dostępu do statystyk dotyczących ukrytych pamięci podręcznych. Na przykład nie ma bezpośredniego sposobu na uzyskanie rozmiaru wszystkich pamięci podręcznych, kluczy obiektów z pamięci podręcznej itp. Jest to abstrakcja o wyższym poziomie niż ta. Można jednak uzyskać dostęp do bazowych rodzimych klas pamięci podręcznej za pomocą metody Cache#getNativeCache(). Pobranie instancji Cache z klasy CacheManager da ci dostęp do tej metody. Zakładając, że znasz podstawowe typy instancji Cache zarządzanych przez CacheManager, możesz rzucić je do odpowiednich typów i uzyskać dostęp do metod pomocniczych na każdym z nich (zakładając, że są jakieś).

Na przykład, jeśli podstawowym składnikiem pamięci podręcznej jest EHCache, można pobrać instancję pamięci podręcznej o nazwie "messages", wywołując CacheManager#getCache("messages"). Będziesz wtedy mógł sprawdzić typ i rzucić typ na net.sf.ehcache.Ehcache, z którego możesz wywołać różne metody pomocnicze dla statystyk (np. getStatistics()).

Oto przykład przechodzenia przez wszystkie pamięci podręczne zarządzane przez CacheManager, sprawdzanie, czy są one typu net.sf.ehcache.Ehcache, a następnie uzyskiwanie ich statystyk.

+0

Jak mogę się upewnić, że po raz pierwszy wywoływana jest funkcja countAllMessages(), nie trafia ona do pamięci podręcznej? – Solubris

+0

Zamiast wywoływać wersję countAllMessages(), należy wywołać metodę getTotalEhCacheSize() lub zamienić kod z getTotalEhCacheSize() na countAllMessages(). Jeśli potrzebujesz rzeczywistego liczenia z bazy danych (lub jakiegokolwiek zaplecza), potrzebujesz do tego specjalnej metody, którą możesz dodać do adnotacji @Cacheable (jeśli chcesz). Jeśli chcesz, aby odświeżył się w dowolnym momencie, usuń pamięć podręczną metod, gdy wywołasz inne metody aktualizacji lub wyodrębnij je ręcznie, na przykład za pomocą zadania działającego w tle. –

Powiązane problemy