2016-04-26 2 views
0

Ich versuche, @CacheEvict und @Cacheable Annotation auf einer einzigen Methode aufzurufen.Aufruf von @CacheEvict- und @Cacheable-Annotation auf einer einzigen Methode?

@CacheEvict(value = "tripDetailsDashboardCache", key = "#userId") 
@Cacheable(value ="tripDetailsDashboardCache", key="#userId") 
public List<DashBoardObject> getAllDetailsForDashBoard(Integer userId){ 
    List<Master> masters = tripDetailsService.getTripDetailsForCaching(userId); 
    List<DashBoardObject> dashBoardObject = tripDetailsService.getMasterDetailsForDashBoard(userId, masters); 
    return dashBoardObject; 
} 

Auf Abruf von @CacheEvict, möchte ich die im Cache gespeicherten Daten für den speziellen Schlüssel löschen und wieder möchte ich die frischen Daten des Verfahrens Antwort zwischenzuspeichern. Aber es speichert nicht die frischen Daten? Und es gibt auch keinen Fehler?

Antwort

0

@CacheEvict wird standardmäßig nach dem Methodenaufruf ausgeführt. Die obige Methode speichert also die Liste mit dem Schlüssel #userId und löscht den Cache dann vollständig.

es macht den Code unklar I separate Cache gespeichert werden und die Cache-evict Methoden

+0

Ich habe separate cachefähige und Cache-Evicted-Methoden erstellt. aber es funktioniert nicht so wie ich es brauchte. Voraussetzung ist, ich werde ein Ticket buchen, es wird in einer DB gespeichert werden, danach werde ich diese zwei Cache-Methoden aufrufen, als nächstes werde ich auf Dashboard-Taste klicken, in dieser Zeit sollte es Daten aus dem Cache nehmen, aber es dauert nicht. und kein Fehler. –

+0

Ich möchte sowohl CacheEvict als auch Cacheable auf derselben Methode aufrufen. denn zuerst möchte ich die daten aus dem cache löschen und dann möchte ich die frischen daten laden. Ist es möglich, beide Annotationen auf dieselbe Weise aufzurufen? –

+0

Die Einstellung "beforeInvocation = true" kann verwendet werden. aber es ist schwer vorherzusagen, wer gewinnt: CacheEvict oder Cacheable – Yura

1

Ich glaube, Sie wollen den Cache zu aktualisieren, so versuchen würde empfehlen, die Schaffung @CachePut zu verwenden, werden Verfahren in allen Fällen durchgeführt werden, wenn Der Schlüssel ist neu, ein neuer Datensatz wird im Cache hinzugefügt. Wenn der Datensatz alt ist, wird der alte Wert durch einen neuen Wert aktualisiert (aktualisiere den Wert).

@CachePut(value = "tripDetailsDashboardCache", key = "#userId") 
public List<DashBoardObject> getAllDetailsForDashBoard(Integer userId){ 
    List<Master> masters = tripDetailsService.getTripDetailsForCaching(userId); 
    List<DashBoardObject> dashBoardObject = tripDetailsService.getMasterDetailsForDashBoard(userId, masters); 
    return dashBoardObject; 
} 
0

Betrachten Sie docs. Es gibt @Caching-Annotation, wo Sie Ihre @Cacheable, @CachePut und @CacheEvict

Verwandte Themen