2015-07-04 4 views
8

Ich benutze neueste Ehcache in meiner Spring 4.1.4 Anwendung. Was ich habe, ist:Spring @Cacheable Methoden mit Listen

class Contact{ 
    int id; 
    int revision; 
}  

@Cacheable("contacts") 
public List<Contact> getContactList(List<Integer> contactIdList) { 
    return namedJdbc.queryForList("select * from contact where id in (:idlist)", Collections.singletonMap("idlist", contactIdList)); 
} 

@CachePut(value="contact", key = "id") 
public void updateContact(Contact toUpdate) { 
    jdbctemplate.update("update contact set revision = ? where id = ?", contact.getRevision(), contact.getId()); 
} 

Was ich erreichen möchte ist, dass die Kontakte im Cache gespeichert sind, und wenn ich wieder die getContactList Methode bin Aufruf, dass alle Kontakte, deren id bereits aus dem abgerufene zwischengespeichert Cache und die anderen sollten normalerweise abgefragt und dann zwischengespeichert werden. Dieser Cache sollte dann die zwischengespeicherte Kontakteinheit aktualisieren, wenn sie aktualisiert wird.

Ich verwende einfache Spring JDBC und Ehcache, keine JPA und kein Hibernate.

Antwort

0

Denke nicht, dass das möglich ist. List<Integer> wird der Schlüssel gegen den Rückgabewert getContactList wird in Cache gespeichert werden.

Also, es sei denn, die Liste der IDs, die in Ihre getContactList eingegeben werden, enthält genau die gleichen IDs wie in einem der vorherigen Aufrufe, wird es ein Cache-Miss und Daten werden von DB abgerufen. (HINWEIS: Zwei Listen werden als gleich, wenn sie genau die gleichen Elemente enthalten und in derselben Reihenfolge)

Eine Möglichkeit ist Ihre Methode getContactList(List<Integer> contactIdList) zu getContact(Integer id) ändern - in diesem Fall kann es eine Weile dauern, Cache zu bauen, aber sobald ein Kontakt Wenn eine gegebene ID im Cache ist, wird die DB nicht verwendet, um sie in zukünftigen Aufrufen erneut abzurufen.

Obwohl nicht elegant, aber eine andere Option ist, die Zwischenspeicherung manuell in getContactList Methode.

Verwandte Themen