Quali sono le cache di primo e secondo livello in Hibernate?


245

Qualcuno può spiegare in parole semplici cosa sono le cache di primo e secondo livello in Hibernate?

Risposte:


300

1.1) Cache di primo livello

La cache di primo livello si associa sempre all'oggetto Session . Hibernate utilizza questa cache per impostazione predefinita. Qui, elabora una transazione dopo l'altra, significa che non elaborerà una transazione più volte. Principalmente riduce il numero di query SQL che deve generare all'interno di una determinata transazione. Cioè invece di aggiornare dopo ogni modifica effettuata nella transazione, aggiorna la transazione solo alla fine della transazione.

1.2) Cache di secondo livello

La cache di secondo livello si associa sempre all'oggetto Factory Session . Durante l'esecuzione delle transazioni, nel mezzo carica gli oggetti a livello di Session Factory, in modo che tali oggetti siano disponibili per l'intera applicazione, non associati a un singolo utente. Poiché gli oggetti sono già caricati nella cache, ogni volta che un oggetto viene restituito dalla query, in quel momento non è necessario eseguire una transazione del database. In questo modo la cache di secondo livello funziona. Qui possiamo usare anche la cache a livello di query.

Citato da: http://javabeat.net/introduction-to-hibernate-caching/


38
+1 per la mappatura della cache di primo livello con oggetto sessione e cache di secondo livello con oggetto factory di sessione. non ho nemmeno bisogno di continuare a leggere.
Mahes,

1
Cache di 1 ° livello. nella maggior parte dei casi non è necessario, ma non è possibile eliminarlo. ma dovresti pensarci tutto il tempo ..
ses

6
@ses Nella maggior parte dei casi è necessario disporre di cache di primo livello. Altrimenti avrai un problema molto BAD PERFORMANCE come una query N + 1, o nessuna cache pre-fetch ansiosa o una query ogni volta che accedi ad un attributo.
Dennis C,

Di solito usiamo la sessione per un periodo di tempo molto breve [e molto body lo consiglia] / sessione di breve durata: non usiamo nemmeno quella cache in quel periodo. se la sessione è di lunga durata, scolleghiamo i dati (ad esempio quando si modifica il modulo) dalla sessione. Sembra che sia necessario solo per uno scenario quando proviamo a utilizzare query-session-api durante la creazione di una complessa richiesta-dopo-richiesta per una sessione di lunga durata.
sabato

1
@DennisCheung: il link è morto. Si prega di aggiornare con javabeat.net/introduction-to-hibernate-caching
NewUser

118

C'è una spiegazione abbastanza buona della memorizzazione nella cache di primo livello sul blog Streamline Logic .

Fondamentalmente, la memorizzazione nella cache di primo livello avviene in base alla sessione in cui la memorizzazione nella cache di secondo livello può essere condivisa tra più sessioni.


20
sono parole semplici proprio lì, non so perché abbiano così difficoltà a spiegarlo
BlackTigerX

hehe ... sì, non so davvero come avrei potuto
diventare

2
questo in realtà è più chiaro per me. il primo è per sessione, mentre il secondo è per la multi-sessione, semplice da tenere a mente. Non possiamo votare due volte? : D
sensei nero,

1
non esiste un esempio per cui è necessaria la cache di 1 ° livello. per quanto mi riguarda nella maggior parte dei casi non è affatto necessario. ma dovresti pensarci sempre e sulla sessione.
sabato

Sono passati 11 anni da questa risposta e sfortunatamente il link non esiste ora. Ma ho trovato il suo contenuto sulla sua pagina web di archivio: web.archive.org/web/20081207044228/http://…
Golu

105

Ecco alcune spiegazioni di base della cache di ibernazione ...

La cache di primo livello è associata all'oggetto "sessione". L'ambito degli oggetti cache è di sessione. Una volta chiusa la sessione, gli oggetti memorizzati nella cache spariscono per sempre. La cache di primo livello è abilitata per impostazione predefinita e non è possibile disabilitarla. Quando interrogiamo un'entità per la prima volta, viene recuperata dal database e memorizzata nella cache di primo livello associata alla sessione di ibernazione. Se interrogiamo di nuovo lo stesso oggetto con lo stesso oggetto sessione, verrà caricato dalla cache e non verrà eseguita alcuna query sql. L'entità caricata può essere rimossa dalla sessione usando il evict()metodo. Il successivo caricamento di questa entità effettuerà nuovamente una chiamata al database se è stata rimossa utilizzando il evict()metodo. L'intera cache di sessione può essere rimossa usando il clear()metodo. Rimuoverà tutte le entità memorizzate nella cache.

La cache di secondo livello è diversa dalla cache di primo livello che è disponibile per essere utilizzata a livello globale nell'ambito della sessione di fabbrica. la cache di secondo livello viene creata nell'ambito della factory di sessione ed è disponibile per essere utilizzata in tutte le sessioni che vengono create utilizzando quel factory di sessione specifico. Significa anche che una volta chiusa la factory di sessione, anche tutta la cache ad essa associata muore e anche il gestore della cache viene chiuso. Ogni volta che la sessione di ibernazione tenta di caricare un'entità, il primo posto in cui cerca la copia cache dell'entità nella cache di primo livello (associata a una particolare sessione di ibernazione). Se la copia cache dell'entità è presente nella cache di primo livello, viene restituita come risultato del metodo di caricamento. Se non è presente alcuna entità cache nella cache di primo livello, viene cercata l'entità cache di secondo livello. Se la cache di secondo livello ha un'entità memorizzata nella cache, viene restituita come risultato del metodo di caricamento. Ma, prima di restituire l'entità, viene memorizzata nella cache di primo livello in modo che la successiva chiamata al metodo di caricamento dell'entità restituisca l'entità dalla cache di primo livello stessa e non sarà necessario passare nuovamente alla cache di secondo livello. Se l'entità non viene trovata nella cache di primo livello e anche nella cache di secondo livello, viene eseguita la query del database e l'entità viene archiviata in entrambi i livelli di cache, prima di tornare come risposta diload() metodo.


2
Spiegazione eccellente! Se potessi disegnare alcuni diagrammi di sequenza sarà fantastico !!!
Adelin,

spiegazione accurata e piacevole
ManishS

1
Se stai cercando di rivedere ciò che già sai, le due risposte precedenti di Dennis C e Iomaxx sono fantastiche, molto succinte e facili da ricordare. Se tuttavia stai cercando una spiegazione della differenza quando non la conosci già, questa risposta è molto migliore!
The Student Soul

Ottima spiegazione !!
blu3,

17

Questa è una domanda molto comune, quindi questa risposta si basa su questo articolo che ho scritto sul mio blog.

Cache di primo livello

Hibernate cerca di rinviare il contesto di persistenza arrossendo fino all'ultimo momento possibile. Come ho spiegato in questo articolo , questa strategia è stata tradizionalmente conosciuta come write-behind transazionale.

Il write-behind è più legato al flushing di Hibernate piuttosto che a qualsiasi transazione logica o fisica. Durante una transazione, il flush può verificarsi più volte.

inserisci qui la descrizione dell'immagine

Le modifiche scaricate sono visibili solo per la transazione del database corrente. Fino a quando la transazione corrente non viene impegnata, nessuna modifica è visibile da altre transazioni simultanee.

Grazie alla cache di primo livello, Hibernate può eseguire diverse ottimizzazioni:

Cache di secondo livello

Una soluzione di cache adeguata dovrebbe estendersi su più sessioni Hibernate e questa è la ragione per cui Hibernate supporta anche una cache di secondo livello aggiuntiva.

La cache di secondo livello è legata al ciclo di vita di SessionFactory, quindi viene distrutta solo quando SessionFactory viene chiusa (in genere quando l'applicazione viene chiusa). La cache di secondo livello è principalmente orientata all'entità, sebbene supporti anche una soluzione opzionale di memorizzazione nella cache delle query.

Per maggiori dettagli, consulta questo articolo .


3

per impostazione predefinita, NHibernate utilizza la memorizzazione nella cache di primo livello basata su oggetti di sessione. ma se si esegue in un ambiente multi-server, la cache di primo livello potrebbe non essere molto scalabile insieme ad alcuni problemi di prestazioni. succede perché deve fare viaggi molto frequenti nel database poiché i dati sono distribuiti su più server. in altre parole, NHibernate fornisce immediatamente una cache L1 in-process di base, non così sofisticata. Tuttavia, non fornisce funzionalità che una soluzione di memorizzazione nella cache deve avere un impatto notevole sulle prestazioni dell'applicazione.

quindi la domanda di tutti questi problemi è l'uso di una cache L2 che è associata agli oggetti factory di sessione. riduce i lunghi viaggi nel database, quindi aumenta i tempi di risposta dell'app.


1

Cache di primo livello

L'oggetto sessione contiene i dati della cache di primo livello. Si è abilitata di default. I dati della cache di primo livello non saranno disponibili per l'intera applicazione. Un'applicazione può utilizzare molti oggetti sessione.

Cache di secondo livello

L'oggetto SessionFactory contiene i dati della cache di secondo livello. I dati memorizzati nella cache di secondo livello saranno disponibili per l'intera applicazione. Ma dobbiamo abilitarlo esplicitamente.


-4

In una cache di secondo livello, i file hbm di dominio possono essere modificabili con chiave e avere un valore falso. Ad esempio, in questa classe di dominio parte della durata in un giorno rimane costante come verità universale. Quindi, può essere contrassegnato come immutabile nell'applicazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.