2015-11-02 10 views
5

Nuovo arrivato da ibernare.Ibernazione: la prima query viene sempre caricata più a lungo

Da quello che ho capito è che, la cache di primo livello è disponibile solo quando una sessione è aperta. Quando la sessione viene chiusa, tutte le entità memorizzate nella cache nel primo livello vengono espulse/rimosse. È corretto?

Ho una semplice applicazione CRUD sviluppata in Java utilizzando il framework Hibernate. E ogni volta che la mia applicazione si avvia, carica ed esegue la sua prima operazione di interrogazione, il tempo di esecuzione è solitamente più lungo delle operazioni di query successive. La prima query richiede in genere 17 ms per l'esecuzione e i successivi sono 1-2 ms.

La mia domanda è questa, questo è veramente il comportamento di Hibernate all'inizio dell'applicazione? I dati caricati dalla prima operazione di query sono memorizzati in una cache da qualche parte? (Sicuramente non la cache di sessione perché dopo aver eseguito la mia prima operazione di query, la sessione viene chiusa subito dopo) Il caricamento impaziente influisce su questo comportamento?

Non ho davvero idea da dove iniziare poiché la documentazione di Hibernate non lo ha coperto. Correggimi se sbaglio

Apprezzo qualsiasi aiuto in quanto davvero non so da dove cominciare a leggere su questo.

EDIT: Per maggiori informazioni, ecco la statistica di sospensione della prima e della seconda operazione di query:

Primo:

100222 nanoseconds spent acquiring 1 JDBC connections; 
0 nanoseconds spent releasing 0 JDBC connections; 
23238430 nanoseconds spent preparing 3 JDBC statements; 
8333256 nanoseconds spent executing 3 JDBC statements; 
0 nanoseconds spent executing 0 JDBC batches; 
0 nanoseconds spent performing 0 L2C puts; 
0 nanoseconds spent performing 0 L2C hits; 
0 nanoseconds spent performing 0 L2C misses; 
40215588 nanoseconds spent executing 1 flushes (flushing a total of 3 entities and 3 collections); 
135213 nanoseconds spent executing 1 partial-flushes (flushing a total of 0 entities and 0 collections) 

Secondo:

168597 nanoseconds spent acquiring 1 JDBC connections; 
0 nanoseconds spent releasing 0 JDBC connections; 
2332976 nanoseconds spent preparing 3 JDBC statements; 
6427565 nanoseconds spent executing 3 JDBC statements; 
0 nanoseconds spent executing 0 JDBC batches; 
0 nanoseconds spent performing 0 L2C puts; 
0 nanoseconds spent performing 0 L2C hits; 
0 nanoseconds spent performing 0 L2C misses; 
1095389 nanoseconds spent executing 1 flushes (flushing a total of 3 entities and 3 collections); 
17600 nanoseconds spent executing 1 partial-flushes (flushing a total of 0 entities and 0 collections) 

Stessa esecuzione della query ma esecuzioni diverse in tempo.

+1

Probabilmente la prima query attiva l'unità di persistenza da inizializzare, l'origine dati da inizializzare dal contenitore e il pool di connessioni da riempire. – Gimby

+0

@Gimby Tutto ciò richiederebbe molto più di 17 ms. –

+0

@DraganBozanovic Dipende, in base all'installazione di glassfish/payara locale, l'unità di persistenza viene configurata in pochissimo tempo, ma succede quando viene utilizzata per la prima volta. Probabilmente dipende da cosa il server fisicamente imposta su richiesta e cosa no. Il mio punto è che un primo hit di inizializzazione dell'utilizzo non è raro. – Gimby

risposta

1

mia domanda è questa, è davvero questo il comportamento di Hibernate sul avvio dell'applicazione?

Quando si apre un documento di Word, ad esempio, ci vorrà molto più tempo la prima volta, piuttosto che quando lo si chiude e lo si riapre. Quindi, questo non è un comportamento specifico di Hibernate.

I dati caricati dalla prima operazione di query memorizzati in una cache da qualche parte?

È memorizzato nella cache "ovunque". Il disco ha i suoi livelli di cache. I sistemi operativi nascondono le cose. Il database memorizzerà di sicuro i dati di accesso frequenti/recenti. Anche i processori hanno le loro cache.

Ma oltre a tutto ciò, Java ha il suo tempo di riscaldamento per sua natura. Quando si accede a una classe per la prima volta, viene caricato da disco, compilato da JIT, ecc.

Stiamo parlando di 17ms qui; è un buon tempo di riscaldamento considerando tutto quanto sopra.

+0

Questo significa che, in tutte le applicazioni di ibernazione, ogni prima operazione di query richiederà sempre più tempo delle query successive? Quindi la cache ibernata non ha luogo qui? – Heisenberg

+1

Corretto, questo non è correlato a nessun tipo di memorizzazione nella cache di Hibernate. –