Caching dichiarativo sulle raccolte

2

Mi interessa usare Spring's Cache Abstraction su un modulo con cui sto lavorando, ma tutte le operazioni sui dati sono in raccolte per evitare più invocazioni dell'origine dati, quindi non sono sicuro di avere un "pointcut" decente a cui fare riferimento alla cache a livello di metodo. Questo non è un problema specifico di Spring o Java, ma più un problema di progettazione.

Ad esempio:

public class SomeDataAccessObject{
 private SomeBatchingDataSourceAbstraction datasource;

 //would ideally add a cache annotation to this method to cache based on input, but that   
 //clearly won't work in this scenario because we are loading multiple which may have 
 //some cache hits only
 public List<String> getNames(List<Integer> ids){
  //ideally I would load as many names as I can from the cache and 
  //then use the datasource to get the rest
  //I can achieve this with a programatic cache but it is very invasive
  return datasource.fetch(ids);
 }

}

Qualcuno ha escogitato un buon modo per ridisegnare un tale scenario che mi permettesse di usare il caching dichiarativo a livello di metodo in stile Spring? Ricorda che voglio mantenere l'oggetto di accesso ai dati (sopra) efficacemente senza stato per essere sicuro.

    
posta smp7d 23.01.2015 - 17:51
fonte

1 risposta

2

Non credo che ciò possa essere realizzato tramite l'astrazione della cache di Spring, il suo design non sembra supportare il tuo caso d'uso (a meno che non fraintenda le tue intenzioni).

Il caching del livello del metodo di Spring dipende dalla possibilità di generare una chiave univoca, dati i parametri del metodo tramite un KeyGenerator. Questo semplice approccio basato sul valore-chiave non funzionerà poiché ci si aspetta che un sottoinsieme dei dati sia memorizzato nella cache a seconda degli ID specifici che vengono passati.

Se stai cercando di memorizzare la cache in base al sottoinsieme di ID nel richiamo, l'utilizzo della cache di query JPA / Hibernate potrebbe soddisfare le tue esigenze.

Spring 4 utilizza per impostazione predefinita il nuovo SimpleKeyGenerator, che produce oggetti SimpleKey utilizzando i contratti hashCode () ed equals () - delegando ad Arrays.deepHashCode () e Arrays.deepEquals () per invocazioni di metodi con parametri multipli.

    
risposta data 23.01.2015 - 19:30
fonte

Leggi altre domande sui tag