EhCache: @CacheEvict auf Mehrere Objekte Mit Annotationen
Ich verstehen, dass die Verwendung von Spring (3.1) errichtet in der Cache-Manager mit dem EhCache Umsetzung gibt es gewisse Einschränkungen, wenn Sie im proxy-Modus (Standard) laut diesem post:
Spring 3.1 @Cacheable - Methode noch ausgeführt
Betrachten Sie das Szenario, die ich habe:
@CacheEvict(value = "tacos", key = "#tacoId", beforeInvocation = true)
removeTaco(String tacoId) {
//Code to remove taco
}
removeTacos(Set<String> tacoIds) {
for (String tacoId : tacoIds) {
removeTaco(tacoId);
}
}
In diesem repository Methode, den Aufruf removeTacos(tacoIds) werden nicht tatsächlich Entfernen Sie etwas aus dem Cache, da der oben beschriebene Beschränkung. Mein workaround ist, die auf einer service-Schicht oben, wenn ich wollte, es zu löschen, mehrere tacos, würde ich die Schleife durch jede taco-Id und übergeben Sie es in removeTaco(), und nie über removeTacos()
Allerdings Frage ich mich, ob es eine andere Möglichkeit, dies zu erreichen.
1) gibt es ein SpEL-Ausdruck, die ich könnte passieren in der Schlüssel, der Ihnen sagen würde, EhCache zu verfallen, jede id im Set?
e.g. @CacheEvict(value = "tacos", key = "#ids.?[*]") //I know this isn't valid, just can't find the expression.
Oder gibt es eine Möglichkeit, ich kann removeTacos () - Aufruf removeTaco und tatsächlich verfallen die Gecachten Objekte?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem @ - Caching-annotation verwendet werden können, kombinieren Sie mehrere Anmerkungen von der gleichen Art wie @CacheEvict oder @CachePut, dies ist das Beispiel aus der Spring-Dokumentation
Können Sie eines von zwei Dingen tun
dem ist aber nicht so schlimm, wenn tacos sind Lesen viel mehr als Sie entfernt werden
ODER
durch den Aufruf der service (proxy) rufen Sie die cache-Räumung.
AFAIK @CacheEvict unterstützt nur das entfernen einzelner Eintrag (durch Taste) oder alle Einträge, die in bestimmten cache, es gibt keinen Weg, um zu entfernen auf einmal mehrere Einträge. Wenn Sie möchten, zu aktualisieren oder entfernen Sie mehrere Objekte aus dem cache (mit Anmerkungen), und Sie können wechseln zu memcached werfen Sie einen Blick auf mein Projekt Einfache Frühling Memcached (SSM).
Selbst Aufrufe nicht über den proxy gehen, so eine der Lösung ist die Umstellung auf einen anderen Modus als proxy. Andere Lösung (die ich nicht empfehle es) kann halten Bezug auf die Dienstleistung im service (als autowired Feld) und verwenden Sie es zum aufrufen removeTaco.
Vor einigen Monaten hatte ich ähnliche Problem in einem meiner Projekte. Es dauerte nicht verwenden, Spring Cache, aber SSM die auch proxy. Um es zu arbeiten, zog ich Zwischenspeichern (Anmerkungen) von service zu DAO (repositories) - Ebene. Es problem mit sich selbst-Aufruf.