2017-08-24 2 views
0

ich eine Methode habe, an dem ich annotation.The Code ein @Cacheable haben, ist, wie untenMit @Cacheable und @CacheEvict im Frühjahr

@Cacheable(value="reporties" , key="{#root.methodName,#manager.name}") 
    public List<Employee> getReportiesForManager(Employee manager){ 
    // code to fetch reporties its a Spring JDBC call 
    } 

Jetzt möchte ich diesen Cache auf einem gewissen Punkt der Zeit vertreiben, wenn Es gibt einige Aktualisierungen für die Berichte für den Manager, wie einige neue Berichte hinzugefügt oder entfernt werden können. Zu dieser Zeit muss ich den Cache dieses Managers entfernen, damit die Anwendung dann neue Daten für diesen Manager holt. Ich warb eine @CacheEvict auf eine Methode, die ich innerhalb der Methode aufrufen, die die Beziehungen von Manager und seinen Berichten aktualisiert.

@CacheEvict(value="reporties",key="{#name}") 
    public void evictReportiesCache(String name){} 

Dieser Code Arbeit intermittierend und ich bin nicht sicher, ob das der richtige Weg cache.Also den Cacheable verwendet #root.methodName als Teil Schlüssel gewaltsam zu vertreiben. Kann mir bitte jemand bei dieser Cache-Räumung helfen.

Antwort

1

Sie können sich den Cache als Map<key, value> vorstellen.

Jedes Mal, wenn Sie eine Methode mit der Annotation @Cacheable aufrufen, schreiben Sie in die Map einen Wert, der dem entspricht, was Sie als Schlüssel definieren.

Jedes Mal, wenn Sie eine Methode mit der Annotation @CacheEvict aufrufen, löschen Sie den mit dem Schlüssel verknüpften Wert. Sie können auch alle Einträge in der Karte löschen.

+0

Die Art, wie ich Cache-Räumung mache, ist richtig? – Mukesh

+0

Wie in der anderen Antwort erwähnt, muss der Wert des Schlüssels, den Sie entfernen, der gleiche sein wie der Schlüssel, den Sie zwischengespeichert haben. – Andres

0

Die an Cacheable und CacheEvict übergebenen Schlüssel müssen identisch sein, wenn sie die gleichen Daten identifizieren.

Wenn Sie Ihre Berichte Cache durch den Namen des Managers gewaltsam zu vertreiben, müssen Sie Cache und evict sowohl allein basierend auf den Namen des Managers.

+0

Ich kann den Schlüssel von cacheable nicht ändern, da er nicht in meiner Kontrolle ist. Der Schlüssel wird sowohl # root.methodName als auch # manager.name haben. Wie man den Metsoname im Cache spezifiziert, um den Schlüssel von cachefähigem – Mukesh

+1

zu entsprechen Sie können es fest codieren – Andres

+0

Ok.Will versuchen hardcoding.Thanks, aber auch diese Annotation ist auf vielen Methoden, muss ich für jedes diese cachefähigen Methoden Räumung schreiben? – Mukesh

Verwandte Themen