2017-06-13 2 views
2

Ich verwende Spring Cache, wo ich in einer Sammlung von Schlüsseln übergeben, und die Rückkehr ist eine Liste von Entitäten. Ich möchte, dass das Caching-Framework versteht, dass jedes Element in der Rückgabeliste mit dem entsprechenden Code zwischengespeichert werden soll. Im Moment scheint der Schlüssel die ganze Liste zu sein, und wenn ich beim nächsten Anruf einen Schlüssel verpasse, wird er versuchen, die gesamte Sammlung erneut zu laden.Spring Cache mit Sammlung von Elementen

@Override 
@Cacheable(value = "countries") 
public List<Country> getAll(List<String>codes) { 
    return countryDao.findAllInCodes(codes); 
} 

eine andere Möglichkeit ist, dass die Rückkehr eine Karte ist, in ähnlicher Weise möchte ich den Cache für Objekte nur Abfrage intelligent genug sein, die noch nie zuvor abgefragt wurden, auch sie jedes Element mit seinem Schlüssel cachen.

@Override 
@Cacheable(value = "countries") 
public Map<String,Country> getAllByCode(List<String>codes) { 
    return countryDao.findAllInCodes(codes); 
} 

Angenommen, die Land-Klasse wie folgt aussieht:

class Country{ 
    String code; 
    String fullName; 
    long id; 

... // getters setters constructurs etc.. 
} 

Ist dies möglich mit Frühlings-Cache?

+0

Warum nicht die zweite Ebene des JPA verwenden? Der Spring-Cache ist im Vergleich zu JPA- oder Cache-Bibliotheken als EhCache sehr hilflos und fehleranfällig beim Caching. – davidxxx

+0

@davidxxx so weit ich verstehe, Spring Cache ist nur eine Abstraktion, und EhCache kann die Implementierung darunter sein. Der Unterschied besteht darin, dass keine Caching-Logik über die Annotation hinaus geschrieben werden muss. Wie würde ich den obigen Code mit JPA schreiben? – Charbel

Antwort

1

In der Tat ist es möglich, auch mit Spring's Caching Abstraction, aber nicht out-of-the-Box (OOTB). Im Wesentlichen müssen Sie Spring Caching-Infrastruktur (Erklärung weiter unten)

von Standard, Spring Caching-Infrastruktur nutzt die gesamte @Cacheable Methodenparameter Argumente als Cache „Schlüssel“ anpassen, wie here erläutert. Natürlich können Sie die Tastenauflösung auch mithilfe eines SpEL-Ausdrucks oder mit einer benutzerdefinierten KeyGenerator-Implementierung anpassen, wie unter here erläutert.

Dennoch dass nicht Bruch die Sammlung oder ein Array von Parameterargumenten zusammen mit der @Cacheable Methode der Rückgabewert in einzelne Cache-Einträge (dh Schlüssel/Wert-Paare, basierend auf dem Array/Sammlung oder Map) bis .

Dafür benötigen Sie eine benutzerdefinierte Implementierung von SpringCacheManager (abhängig von Ihrer Caching-Strategie/Provider) und Cache Schnittstellen.

HINWEIS: Ironischerweise wird dies das dritte Mal, dass ich fast die gleiche Frage beantwortet habe, erste here, dann here und jetzt hier, :-). Anyway ...

Ich habe aktualisiert/bereinigt my example (ein bisschen) für diesen Beitrag.

Beachten Sie, dass my example extends and customizes die ConcurrentMapCacheManager im Spring Framework selbst zur Verfügung gestellt wird.

Theoretisch könnten Sie erweitern/fertigen jede CacheManager Implementierung, wie Redis des in Spring Data Redis, here (source) oder Pivotal GemFire ​​desCacheManager in Spring Data GemFire ​​, here (source). Die Open-Source-Version von Pivotal GemFire ​​ ist Apache Geode, die ein entsprechendes Spring Data Geode Projekt hat, (source for CacheManager in Spring Data Geode, die im Wesentlichen identisch mit SD GemFire ​​ist). Natürlich können Sie diese Technik auf andere Caching-Provider gelten ... Hazelcast, Ehcache usw.

wird jedoch von den custom implementation behandelt die wirklichen Mut der Arbeit (speziell oder mores, die base class) von SpringCache Schnittstelle.

Wie auch immer, hoffentlich von my example, können Sie herausfinden, was Sie in Ihrer Anwendung tun müssen, um die Cache-Anforderungen Ihrer Anwendung zu erfüllen.

Zusätzlich können Sie den gleichen Ansatz für die Handhabung Maps anwenden, aber ich werde das als Übung für Sie verlassen, ;-).

Hoffe, das hilft!

Cheers, John

+0

Danke @John Ich schaue mir das an und versuche es für meine Bedürfnisse umzusetzen! – Charbel

Verwandte Themen