2011-04-15 14 views
8

Abbiamo un'app middleware Java (J2SE) ad alte prestazioni in cui la latenza è della massima importanza. Utilizza alcuni dati permanenti contenuti in un database precedente, in cui un'applicazione legacy può modificare occasionalmente i dati. A causa del requisito di latenza, stiamo pianificando di memorizzare nella cache i dati permanenti, utilizzando JPA con Hibernate e magari un provider di cache come Ehcache.Aggiornamento cache in background JPA

Tuttavia, quando i dati permanenti vengono aggiornati (dall'app legacy), è necessario ricevere una notifica al più presto possibile. Stavo pensando di impostare una scadenza sulla cache, ma poi la cache non verrà aggiornata fino a quando la richiesta successiva per i dati viene effettuata dall'applicazione - a quel punto la latenza verrà effettuata a causa della rilettura del database.

Idealmente abbiamo bisogno della cache per restituire un valore scaduto, e in background la cache viene aggiornata/aggiornata con l'ultimo valore dal database a intervalli regolari.

Ciò è possibile con Ehcache? Ho visto SelfPopulatingCache e CacheLoader, ma sembra che sto facendo un sacco di lavoro (dovrei scrivere il codice di scrittura per ogni entità). Inoltre, qualcuno ha un esempio di implementazione di CacheLoader? Speravo in un'opzione di aggiornamento asincrono su Query Cache.

Ci sono altre tecnologie là fuori che potrebbero fornire una soluzione? Non siamo vincolati dal fornitore JPA o dal fornitore di cache.

Potrebbe Spring @Cacheable fornire una soluzione? Ho visto che lo spring ehcache cachable menziona il self-populating-cache-scope, ma non mi è chiaro cosa significhi.

Grazie in anticipo.

+0

Quali sono le opzioni di integrazione disponibili dall'app legacy? – Santosh

risposta

1

Se è possibile modificare l'applicazione legacy, un'opzione è di inviare avvisi di annullamento della cache con qualcosa come ActiveMQ. Se non puoi modificare l'applicazione legacy, un'altra opzione è aggiungere una colonna timestamp/rowversion indicizzata alla tua tabella e periodicamente interrogarla per le modifiche dal sondaggio precedente.

5

Che database stai utilizzando?

EclipseLink 2.4 fornirà una funzione di invalidazione della cache basata su eventi del database. Questo è integrato con il database Oracle DCN/QCN. Potresti anche essere in grado di collegare qualcosa con i trigger.

http://wiki.eclipse.org/EclipseLink/Examples/JPA/DCN

si può anche voler indagare Oracle GoldenGate, Coerenza e TopLink griglia.

1

Non so come farlo usando EhCache o altri componenti, ma un approccio comune a questo problema è "avere 2 cache". Lascia che ti spieghi: hai una cache che serve la tua applicazione con i dati (questa cache non avrà alcun aggiornamento mentre serve l'applicazione) e un'altra cache creata da un lavoratore a tempo con i dati più recenti (puoi creare una cache ogni x secondi o ogni volta ricevi un evento che ti dice che i tuoi dati sono cambiati). Quando la nuova cache è completa, sostituisci la vecchia cache con quella nuova, quindi la cache di aggiornamento recente sta ora servendo l'applicazione con la latenza della cache 0. Come puoi vedere, il problema con questo approccio è che il client potrebbe visualizzare dati obsoleti mentre la nuova cache non è completa. E, ovviamente, è un metodo molto costoso (avrete 2 cache in memoria molto spesso e costruirete una nuova cache molto spesso).

Problemi correlati