2015-07-04 12 views
8

Sto usando l'ultima versione di Ehcache nella mia applicazione Spring 4.1.4. Quello che ho è:Spring @Metodi memorizzabili con liste

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()); 
} 

Quello che voglio ottenere è, che i contatti sono memorizzati nella cache, e quando sto chiamando di nuovo il metodo getContactList, che tutti i contatti il ​​cui id è già memorizzata nella cache vengono recuperati dal cache e gli altri dovrebbero essere interrogati normalmente e quindi memorizzati nella cache. Questa cache dovrebbe quindi aggiornare l'entità di contatto memorizzata nella cache quando viene aggiornata.

Sto usando Spring JDBC ed Ehcache, nessun JPA e nessun Hibernate.

risposta

0

Non pensare che sia possibile. List<Integer> sarà la chiave contro il valore restituito di getContactList verrà salvato in cache.

Quindi, a meno che l'elenco di ID che vengono immessi sul tuo getContactList contenga esattamente gli stessi ID di una delle precedenti chiamate, sarà un errore di cache e i dati verranno recuperati dal DB. (NOTA: Due liste sono considerate uguali se contengono esattamente gli stessi elementi e nello stesso ordine)

Un'opzione è di cambiare il metodo getContactList(List<Integer> contactIdList) in getContact(Integer id) - in questo caso potrebbe richiedere un po 'di tempo per compilare la cache, ma una volta un Contatto per un dato ID è nella cache, DB non verrà utilizzato per recuperarlo nelle chiamate future.

Anche se non elegante, ma un'altra opzione è eseguire manualmente la memorizzazione nella cache nel metodo getContactList.