2015-05-23 7 views
5

Ho letto che utilizzando la cache di secondo livello di Hibernate, può migliorare le prestazioni delle applicazioni avendo meno hit di database per il recupero di dati/oggetti.Come ibernazione garantisce che la cache di secondo livello sia aggiornata con i dati più recenti nel database

Tuttavia, la modalità di sospensione assicura che la cache di secondo livello sia aggiornata con i dati nel database.

Ad, esempio:

Supponiamo classe inferiore è un'entità e persisteva nel DB.

@Entity 
class User { 
    Id 
    private int id; 
    private String str; 
} 

Ora, se abbiamo abilitato cache di secondo livello, capisco che se apriamo diverse sessioni poi ogni sessione sarà colpito il secondo cache di livello per il recupero di valore dell'oggetto.

Ora, se i dati nel database vengono modificati (ad esempio per riga con id = 1), dicono da un processo indipendente/cambiando manualmente i valori, e proviamo ad accedere al valore, in che modo hibernate rileva che la cache sta avendo ultimo valore (per id = 1).

In generale, in che modo l'ibernazione garantisce che i dati nella cache di secondo livello siano coerenti con i valori di db.

Grazie per il vostro aiuto.

risposta

8

Hibernate gestisce la cache di se stesso, in modo che quando si aggiornamento qualche entità attraverso ibernazione sessione sarà invalidare voce della cache assocciated con questa entità - così cache è sempre fresco.

Se un altro processo (o anche la seconda JVM in esecuzione la stessa applicazione di ibernazione) record di aggiornamenti nel database, Hibernate sulla prima JVM non è a conoscenza di questo fatto e ha stantio oggetto nella sua cache.

Tuttavia è possibile utilizzare qualsiasi implementazione cache (provider cache) desiderata. Esistono molti provider di cache pronti per la produzione che consentono di configurare il tempo in cui la data entità verrà memorizzata nella cache. Ad esempio, puoi configurare la cache per invalidere tutte le entità dopo 30 secondi e così via.

Se si utilizza provider di cache di EHCache è possibile fornire tale configurazione:

<cache name="com.my.company.Entity" 
    maxElementsInMemory="1000" 
    eternal="false" 
    timeToIdleSeconds="7200" 
    timeToLiveSeconds="7200" 
    overflowToDisk="false" 
    memoryStoreEvictionPolicy="LRU"/> 

È possibile trovare maggiori informazioni abount cache L2 qui: http://www.tutorialspoint.com/hibernate/hibernate_caching.htm

tuttavia c'è un sacco di tutorial utili su.

+0

Grazie mille per le informazioni dettagliate. Quindi, possiamo considerarlo uno degli svantaggi dell'utilizzo dell'ibernazione? Ci sono rimedi per questo? – CuriousMind

+1

Non si tratta tanto di ibernazione, ma è un problema di principio con le cache.Come tutti sappiamo, ci sono 10 problemi nell'IT: nominare le cose e invalidare la cache e con uno degli errori –

+0

@Jens Sì, nominare le cose è probabilmente il peggiore :) –

3

Non funziona.

Se si modificano i dati nel database senza utilizzare la modalità di ibernazione, questo non verrà rilevato e la cache e il database non verranno sincronizzati.

+0

Se alcuni componenti all'interno della stessa applicazione modificano i valori (usando la sospensione) come tiene traccia delle modifiche? – CuriousMind

Problemi correlati