Domanda

Q1: Ho ragione che solo questa fornitori supporto per sospensione di cache L2 su cluster?

  • di terracotta a Hibernate (comercial)
  • SwarmCache (non rilasciato dal 2003)
  • JBoss Cache 1.x
  • JBoss Cache 2

Q2: Sono ci sono delle alternative per il letargo cache L2? (Forse qualche DB caching?)

È stato utile?

Soluzione

Q1. EHCache funziona molto bene come Hibernate L2 Cache, distribuito. Stiamo usando questo per il nostro progetto.


Q2. Diverse le cache sono possibili.

  • Tutti i dati stanno già facendo un sacco di caching internamente, quindi non preoccupatevi di questa parte.
  

Tuttavia, il problema con il database   cache è che è fisicamente sul   server di database, in modo da ogni query   coinvolge una chiamata di rete (latenza,   larghezza di banda ..). Questo è il punto   delle cache per l'applicazione   server.


  • La cache L2 Hibernate ha alcune specifiche:
    • molto facile da lavorare (nessun codice, poco configurazione)
    • concettualmente a livello di entità (che è abbastanza a grana fine, a volte abbiamo bisogno di memorizzare nella cache i grani più grandi, per rendere meno richieste al database),
    • di lavoro da id o di raccolta (per esempio, memorizzando una risultato della query è disattivata di default, perché è impossibile per renderlo utile nel caso generale).

  • Quando il Hibernate L2 è inadeguato, usiamo la stessa libreria EHCache ai dati della cache (che non è esattamente entità). Esempi di casi d'uso:
    • quando una tabella è grande (lunghezza di registrazione e numero) , l'utilizzo della memoria non avrebbe permesso di cache completamente, ma di caching solo tre campi per tutti i record va bene. Potrebbe essere che questi campi sono quelli accede spesso, o immutabile ...
    • quando abbiamo molti accessi in lettura alla cache, e ciascuno innescherebbe una calcolo (sulla cache L2) date le entità che abbiamo: il risultato di calcolo possono essere memorizzati nella cache. (Tipico esempio dove il calcolo richiede dati da altre tabelle, ma i dettagli non sono utilizzati nel risultato finale, quindi la cache non memorizza questi dettagli)
    • quando le entità in una tabella sono logicamente raggruppati per categorie , e noi vogliamo richiedere e cache di una categoria alla volta, al posto della normale politica di cache L2 che sarebbe un soggetto alla volta.
  

In un contesto distribuito, questo spesso   si traduce in un invalidando   categoria in un momento in cui uno di loro   entità viene modificato, che è funzionalmente   logico per noi (ed essenziale per   prestazioni, altrimenti faremmo   dovuto invalidare tutti questi   entità ; questo è perché la cache   invalida un'intera regione, o   oggetto specifico, ma in   tra dovete ciclo che è male per le prestazioni)

E altri sono sicuro ...

Quindi questo caso non è strettamente relative al database, di solito non memorizza le nostre entità Hibernate. L'abbiamo messo nel livello aziendale (e non l'accesso ai dati o il Tao), renderlo disponibile direttamente ai codici aziendali. Si noti che per noi, non è una cache trasparente, ma una chiamata a un servizio aziendale esplicita (responsabile di questa cache: caricarla se i dati non è presente, invalidando se necessario). Che fa operazioni o consegnare valori

  

Un divertente problema di threading in questa cache: perché questa cache si accede da nostri cento le discussioni web, ha bisogno di essere thread-safe. Probabilmente sapete il motivo per cui un valore di thread-safe o è immutabile o clonato ad ogni chiamata (che spesso è un problema di prestazioni). Così tutti i nostri nascondigli imprese utilizzano oggetti immutabili, e le prestazioni è grande.

Altri suggerimenti

È anche possibile usare [Infinispan (evoluzione del JBoss Cache) come 2 ° fornitore di cache di livello!] [1]

[1]: Vedere http: // infinispan. blogspot.com/2009/10/infinispan-based-hibernate-cache.html

EHCache ha una modalità distribuita, ma non sono sicuro se questo è supportato con Hibernate. Non vedo perché non dovrebbe funzionare, però.

Forse si omette JBossCache 3 per qualche motivo specifico?

hibernate-Redis lib sarebbe scelta perfetta. Si tratta di una cache basata Redis.

Perché Redis? è velocissimo, lavora a nuvola e ha soluzione pronta Cloud come AWS Elasticache , in modo da don' t bisogno di gestire da soli.

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