2014-11-12 5 views
5

Se un metodo contrassegnato con @Cacheable richiede 10 minuti per il completamento e due thread t1, t2, accedere al metodo.Il blocco Spring @Cacheable se vi si accede da più di 1 thread?

t1 accessi al tempo 0 (metodo di cache è ora gestito per la prima volta) t2 accede al tempo t1 + 5 minuti

Questo significa che t2 non accedere ai dati per circa 5 minuti dal t1 è già iniziata l'operazione @Cacheable e deve essere completata in 5 minuti (dato che è in esecuzione da 5 minuti) o verrà invocata una nuova chiamata a @Cacheable da t2?

+2

supporto per le cache sincronizzati in primavera 4.3: https://spring.io/blog/2016/03/04/core-container-refinements-in-spring-framework-4-3 – Thomas

risposta

2

Se il risultato della prima esecuzione non è stato memorizzato nella cache, verrà eseguita la seconda chiamata.

È necessario comprendere che @Cacheable è centrato attorno al contenuto della cache (e non in particolare al contesto di esecuzione di un thread [beh, tipo, la cache deve ancora essere protetta da thread]). All'esecuzione di un metodo, la cache viene prima verificata per vedere se la chiave esiste: se t1 impiega un po 'per completare, il suo risultato non sarà memorizzato nella cache, quindi le esecuzioni concorrenti procederanno senza riguardo per l'esecuzione di t1

+0

Quale risultato sarà essere memorizzato nella cache? il completamento dell'esecuzione del secondo thread sovrascriverà il primo risultato memorizzato nella cache? –

+0

Almeno, per la cache basata su ConcurrentMap, dovresti ottenere il risultato della prima esecuzione (passando per le regole di base della mappa, se c'è un valore per la chiave fornita, viene restituito il valore precedente) @UsamaTariq – kolossus

+0

Quando è arrivato il secondo thread l'esecuzione non ha avuto alcun valore nella cache (poiché t1 richiede un po 'di tempo per essere completato) pertanto t2 avvierà anche l'esecuzione. Per quanto ne so, il risultato viene memorizzato nella cache dopo il completamento dell'esecuzione. t1 memorizzerà i risultati in cache, ma t2 verrà completato in seguito. Non dovrebbe sovrascrivere i risultati precedenti? o controllerà l'esistenza prima della cache? –

1

Come colosso spiegato, la cache viene controllata prima della chiamata al metodo. Quindi, se l'elemento non è nella cache (come sarà il caso in t1 + 5 min), l'invocazione del metodo avverrà anche per il thread t2.

Non è presente alcun "blocco" sull'annotazione @Cachebile. t2 chiamerà il metodo come se ci fosse un cache-miss e quindi t2 impiegherà anche 10 minuti per completare lo stesso metodo.

1

Nessun blocco su @Cacheable.

Ma è possibile utilizzare la strategia di blocco della cache nell'implementazione della cache. La prima query trovata miss ha la responsabilità di ricostruire la cache. Altre query attendono fino a quando la cache non viene ricostruita.

  • Per l'implementazione della cache locale, utilizzare ReadWriteLock. Vedi lo net.sf.ehcache.constructs.blocking.BlockingCache.
  • Per l'implementazione della cache remota, utilizzare il blocco centrale ghetto.
si aggiunge
Problemi correlati