Domanda

Ho un oggetto di dominio Hibernate che viene caricato da diverse parti dell'applicazione. A volte è vantaggioso carico pigri ogni associazione e gli altri è meglio caricare l'intera cosa in un unico uniscono. Come compromesso si spera felice che ho trovato:

Utilizzando recupero batch, Hibernate può caricare diverse proxy inizializzate se proxy è accessibile. Batch recupero è un'ottimizzazione della strategia di recupero di selezione pigro.

hibernate.default_batch_fetch_size :

  

Utilizzando il recupero in batch, Hibernate può caricare diverse deleghe non inizializzate   se uno delega si accede. Batch recupero è un'ottimizzazione della   pigro selezionare strategia di recupero.

Vedo anche:

hibernate.jdbc.fetch_size:

  

Un valore diverso da zero determina la JDBC dimensioni di raccolta (chiamate Statement.setFetchSize ()).

Bene è Hibernate abbastanza intelligente per guardare nella cache di secondo livello quando si fa il lotto recupero? cioè Do uno fetch per la chiamata iniziale per l'associazione e poi le chiamate X accanto colpito la cache? In questo modo posso avere il lazy loading io voglio, ma anche colpito la cache spesso per le operazioni di maggior massa simile.

Se tutto il contenuto della raccolta è già contenuta nella cache, sarebbe comunque eseguire le query fetching sull'accesso della collezione?

Grazie.

È stato utile?

Soluzione

Ho fatto un sacco di ricerca di oggi e sono stato in grado di scavare una risposta alla mia domanda. Stavo guardando attraverso il codice Hibernate e il flusso si presenta così:

è la collezione inizializzato?

  • No? Non un lotto fetch (articoli ottenuti per lotto-fetch sono collocati nella cache)
  • Sì? Cercare nella cache per quel particolare oggetto, se non è ci fanno un batch-fetch.

Quindi, se l'elemento della collezione che stai cercando si trova nella cache, allora il batch-fetch non accade. Se l'articolo non si trova nella cache di secondo livello, allora il lotto fetch accade, ma lo farà un'operazione di recupero di oggetti batch indipendentemente dal fatto che gli elementi in batch sono nella cache.


----- ESEMPIO 1 -----

Il buono:

(Tre elementi di una collezione - dimensione del lotto di 3) Il primo colpo:

  • collection.getItem (0) - No cache | lotto-fetch 3 articoli
  • collection.getItem (1) - caricato per lotti-fetch
  • collection.getItem (2) - Loaded in lotti da-fetch

Ora, da qualche altra parte, più avanti nel tempo:

  • collection.getItem (0) - Hit Cache
  • collection.getItem (1) - Hit Cache
  • collection.getItem (2) - Hit Cache

----- ESEMPIO 2 -----

Il cattivo:

(Tre elementi di una collezione - dimensione del lotto di 3)

In questo caso, l'elemento di indice 0 è stato rimosso dalla cache perché forse la cache era pieno e l'oggetto è stato eliminato, o la voce è andato stantio o inattivo.

  • collection.getItem (0) - Non in cache in modo da lotto di 3 (??? Selezionare * dove id in (,,))
  • collection.getItem (1) - In Cache Already (sostituito da lotto-fetch comunque)
  • collection.getItem (2) - In Cache Already (sostituito da lotto-fetch comunque)

Quindi, il compromesso è qui che avrete un minor numero di chiamate SQL a causa di dosaggio, ma ti mancherà di mettere in cache più spesso. C'è un biglietto aperto per avere l'aspetto di dosaggio nella cache di secondo livello prima che esca al database.

http://opensource.atlassian.com/projects/hibernate/browse / HHH-1775

Votare it up!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top