2012-01-06 9 views
5

Voglio usare ehcache non solo come cache ma come contenitore di oggetti sporchi che voglio scaricare nel mio database quando gli oggetti vengono espulsi/scaduti. durante la normale elaborazione, io uso una chiave per cercare in ehcache. se la chiave non è presente, leggo i dati dal database e li metto in ehcache. il valore è in realtà un oggetto complesso che modifico. quando si verifica la condizione ttl/idle time/overflow, vedo che i callback CacheEventListener vengono richiamati. ma c'è un grosso problema. il notifyElementExpired viene chiamato dopo che il valore-chiave è stato rimosso dalla cache. quindi c'è una condizione di gara. se faccio il compito di svuotare il valore dirty in cache in notifyElementExpired e allo stesso tempo, in un altro thread, letta per la stessa chiave, allora c'è un problema di sincronizzazione. il secondo thread non troverà l'oggetto in ehcache e quindi andrà al database mentre l'altro thread è ancora pronto per lo svuotamento.questo caso d'uso può essere elaborato in ehcache?

ho provato a sperimentare con ehcache write-through e non penso che funzioni anche questo.

c'è una soluzione qui ??

Apprezzerei molto le buone soluzioni a questo problema anche se coinvolge qualche altro meccanismo di memorizzazione nella cache diverso da ehcache.

grazie

+0

Non sono riuscito a trovare nessuna risposta a questa domanda. Così sono andato avanti e l'ho risolto io stesso! Ecco la soluzione che ho scritto sul blog - http://blog.readypulse.com/2012/01/08/ehcache-as-a-true-persistent-store-backed-cache/ –

+1

Nice work TVinodGupta. Come promemoria amichevole, puoi per favore pubblicare una risposta alla domanda tu stesso e quindi accettare quella risposta in modo che possiamo chiudere questa domanda? Inoltre, è necessario accettare le risposte alle domande precedenti se risolvono il problema. – Zecas

risposta

1

Se sei ok con una cache puramente in memoria, io suggerirei che si estende della biblioteca Google Guava CacheLoader, es:

public class DBLoader extends CacheLoader<String, String> { 

    @Override 
    public String load(String key) throws Exception { 
     // load a value from the database 
     return value; 
    } 
} 

Poi, nel loro utilizzo, qualcosa come:

private LoadingCache<String, String> dbCache = CacheBuilder.newBuilder() 
.expireAfterWrite(CACHE_EXPIRE_IN_SECONDS, TimeUnit.SECONDS) 
.build(new DBLoader()); 

String value = dbCache.get(someKey); 


È necessario riordinare ciò con una corretta gestione delle eccezioni, naturalmente.

Trovo che guava sia molto più semplice che ottenere un'ehcache configurata correttamente.

+1

Guava ha le sue condizioni di gara: https://github.com/google/guava/issues/1881 – CurtainDog

Problemi correlati