2016-06-27 7 views
0

I ehcache (2.10.1) und Feder (4.2.5)ehcache Frühling Optimierung

Ich baute mein BookDao Methoden mit Cache wie folgt bin mit:

@Cacheable(value = "bookByName", key = "#name") 
public Book findByName(String name) { 
    //find book by name in db 
} 

@Cacheable(value = "bookById", key = "#id") 
public Book findById(int id) { 
    //find book by id in db 
} 

@Cacheable(value = "books", key = "??") 
public List<Book> findAll() { 
    //find books in db 
} 

Erstens wäre es möglich, zu kombinieren findAll Cache mit findById Cache oder findByName Cache? Was sollte ich in die key annotation parameter tun, um dies zu tun?

Zweitens, wenn ich ein Buch aktualisieren oder erstellen möchte, muss ich dieses Buch in jedem Cache hinzufügen/entfernen und die gesamte Liste der findAll Methode vertreiben. Gibt es einen anderen Weg, dies besser zu machen?

Antwort

2

Beantworten auf konzeptioneller Ebene. Es ist im Grunde das identische Problem für jeden Cache sowie für Spring-Caching-Annotationen oder JSR107-Caching-Annotationen.

Erstens wäre es möglich, findAll Cache mit findById Cache oder findByName Cache zu kombinieren? Was sollte ich in den Key-Annotation-Parameter eingeben?

Nein, dies ist nicht möglich mit Anmerkungen. Außer dem Löschen des Caches können Sie keine Massenoperationen mit Anmerkungen durchführen.

Eine Möglichkeit wäre, alle Einträge im Cache mit der imperativen Cache-Schnittstelle abzurufen, aber das sind nur die Bücher im Cache, nicht alle verfügbaren Bücher. Der Cache kennt nicht jedes Buch, das verfügbar ist, zumindest wenn es sich wirklich um einen Cache handelt.

Zweitens, wenn ich will ein Buch, das ich hinzufügen müssen aktualisieren oder erstellen/vertreiben dieses Buch auf jedem Cache und die gesamte Liste der findAll Methode zu vertreiben. Gibt es einen anderen Weg, dies besser zu machen?

Wenn Sie eine Liste aller Bücher haben, wofür benötigen Sie den Cache?

Sie könnten eine Teilmenge aller Bücher in einer Liste zurückgeben. In diesem Fall könnte der Parameter eine Abfrage sein. Die Listengröße sollte begrenzt sein, damit Ihnen bei der Verarbeitung und beim Zwischenspeichern nicht zu wenig Speicher zur Verfügung steht. Idealerweise geben Sie List<Integer> mit den IDs oder List<Book> zurück, die mit einem ID-Array gesichert werden und die Buchobjekte aus dem Cache abrufen. Wenn Sie alle Bücher bearbeiten möchten, wäre eine Methode Iterator<Integer> findAll() oder Iterator<Book> findAll() geeigneter. Sie sollten es nicht zwischenspeichern, denn: Die Ergebnisgröße ist unbegrenzt, der Cache macht nur Sinn, wenn auf kleine Teile der Daten öfter zugegriffen wird.