2016-02-16 19 views
5

Sto tentando di configurare Infinispan come cache di secondo livello di ibernazione. Va tutto bene, ma voglio modificare la configurazione predefinita, cioè i valori condivisi da tutte le cache.Infinispan JPA impostazioni di cache di secondo livello

Le cache vengono create automaticamente per le entità annotate con @Cache e posso personalizzarle una per una in infinispan.xml entro il <distributed-cache-configuratoin>. Tuttavia, mi piacerebbe avere valori predefiniti (ad esempio strategia di sfratto) per tutte queste cache.

Un'altra cosa è che voglio contrassegnare tutte queste cache generate come "distribuite" (sono "locali" per impostazione predefinita).

Ecco un exceprt dal mio infinispan.xml:

<cache-container default-cache="default" statistics="true"> 
    <transport stack="external-file" /> 
    <!-- Configuring specifics for the User entity. How to do it globally? --> 
    <distributed-cache-configuration name="user" statistics="true" /> 
</cache-container> 

Come posso fare queste cose?

+1

La configurazione di default della cache è chiamata 'entity'. Configura una cache con quel nome e dovrebbe applicarsi a tutte le entità. –

+0

Bello .. grazie. hai un riferimento dalla documentazione per questo? – Bozho

+1

http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#caching-provider-infinispan-config –

risposta

4

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:

  1. Recupera lo stato A dell'entità.
  2. Recupera lo stato B in base all'ID archiviato nell'associazione b.
  3. Scarica la raccolta degli ID cs.
  4. 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).