Il default cache configuration per le entità si chiama entity
:
configurazione della cache possono differire per ogni tipo di dati memorizzati nella cache . Per poter cambiare il modello di configurazione della cache, utilizzare struttura hibernate.cache.infinispan.data-type.cfg
dove data-type
può essere:
entity
entità indicizzati da @Id
o @EmbeddedId
attributo.
immutable-entity
Entità contrassegnate con annotazione @Immutable
o impostare come mutable=false
nel file di mapping.
naturalid
Entità indicizzate dall'attributo @NaturalId
.
collection
Tutte le collezioni.
timestamps
Tipo di entità di mapping → data/ora dell'ultima modifica. Usato per il caching delle query.
query
Query di mapping → risultato della query.
pending-puts
cache ausiliarie per le regioni che utilizzano la modalità di annullamento cache.
L'impostazione predefinita per collection
, immutable-entity
e naturalid
è anche la configurazione specificata per entity
, in modo da non essere necessario configurare separatamente (se non si vuole configurazioni separate, naturalmente), come si può vedere in il documentation e lo source code.
Nota
In generale, facendo una cache Hibernate L2 distribuito non può essere una buona idea, perché le istanze di entità vengono memorizzati nel disassembled hydrated state nella cache L2, il che significa che solo gli ID delle entità associate sono memorizzate insieme con lo stato dell'entità genitore.
Supponiamo di avere le seguenti entità (A
, B
, C
sono tutti cachable):
@Entity
public class A {
@ManyToOne
private B b;
@OneToMany
private Collection<C> cs;
}
Anche se la raccolta cs
erano cachable anche, per assemblare completamente un'entità A
esempio dalla cache avreste i seguenti round trip di rete agli altri nodi del cluster:
- Recupera lo stato
A
dell'entità.
- Recupera lo stato
B
in base all'ID archiviato nell'associazione b
.
- Scarica la raccolta degli ID
cs
.
- Per ciascun ID nella raccolta
cs
, scaricare lo stato dell'entità C
, uno per uno.
Ovviamente, se si sta assemblando di raccolta di A
casi (da un risultato di una query per esempio), tutto quanto sopra viene eseguita per ogni istanza di A
.
Tutto ciò implica che la lettura dei dati direttamente dal database (con caricamento lazy configurato correttamente, utilizzando batch size per esempio), potrebbe essere molto più efficiente di tutti i round trip della rete in una cache distribuita.
Inoltre, questo è uno dei motivi per cui la cache di entità/raccolta deve essere eseguita in modalità cluster di invalidazione (i dati vengono memorizzati nella cache solo sul nodo che lo legge/scrive, ma è invalidato su altri nodi quando viene modificato).
La configurazione di default della cache è chiamata 'entity'. Configura una cache con quel nome e dovrebbe applicarsi a tutte le entità. –
Bello .. grazie. hai un riferimento dalla documentazione per questo? – Bozho
http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#caching-provider-infinispan-config –