2012-08-24 12 views
12

Uso NHibernate con Memcached come cache di secondo livello e sono sempre stato curioso dell'opzione di configurazione cache.use_minimal_puts.NHibernate e Memcached - deve essere utilizzato l'utilizzo di quantità_minali?

Secondo la documentazione:

hibernate.cache.use_minimal_puts: ottimizza il funzionamento cache di secondo livello per ridurre al minimo le scritture, a costo di più frequenti letture. Questa impostazione è particolarmente utile per le cache in cluster e, in Hibernate3, è abilitata per impostazione predefinita per le implementazioni della cache cluster .

Per essere chiari, non sto eseguendo Memcached in un ambiente cluster, ma viene eseguito su un computer remoto. Un altro fattore da considerare potrebbe essere se vi sia o meno una grande differenza di velocità tra la lettura e la scrittura su Memcached.

Potrei trarre vantaggio dall'abilitazione di cache.use_minimal_puts in questo scenario?

+0

"al costo di letture più frequenti" - si legge anche implica in sovraccarico sulla rete, giusto? –

+0

@ PlínioPantaleão - Buon punto..so forse una domanda migliore sarebbe: le scritture (molto) più costose di quelle in memcached? – DanP

+0

Non ho alcuna prova per sostenere la mia opinione, ma non ci credo. Questo è vero solo negli ambienti distribuiti perché una scrittura potrebbe causare la perdita di cache su altre macchine. Se questo fosse stato vero nel caso di una singola macchina, penso che lo avrebbero fatto prima :) –

risposta

15

Non ho esperienza in NHibernate ma ho lavorato con cache di secondo livello in Hibernate e mi è stato detto che gli stessi concetti sono applicabili a entrambi.

L'idea alla base fornendo il parametro hibernate.cache.use_ minimal_puts è che prima sospensione mette un oggetto nella cache per primo controllare la cache di secondo livello se l'oggetto è già presente, e se non allora solo mettere Là.

Questo sarebbe utile SOLO quando i dati letti dalle cache sono molto meno costosi degli aggiornamenti dei dati. Questo è ciò che significa la documentazione qui di seguito

... ottimizzazione del funzionamento cache di secondo livello per ridurre al minimo le scritture, al costo di più frequenti legge.

Il caso che si adatta perfettamente a questo tipo di ottimizzazione è la replica in clustering.

Se si utilizza il clustering, l'operazione put è molto costosa in quanto attiva i listener di replica della cache in caso di cache in cluster. Se non si utilizza il clustering, questa operazione put è relativamente molto economica.

Anche in caso di clustering potrebbero esistere provider di cache che si basano sull'invalidità delle entità invece di replicare le modifiche apportate a tali entità. Anche in questo caso, questo parametro sarebbe inutile.

Un fattore che può ostacolare le prestazioni è il tipo di replica sincrona o asincrona utilizzato da Memcache. Non ho usato MemCache ma EhCache supporta entrambi i modelli.

Quindi nel tuo caso come lo sei NON utilizzando il clustering e sebbene la cache sia in un processo remoto, dubito seriamente che ci sarebbero dei vantaggi in termini di prestazioni impostando questo parametro su true.

0

Solo per aggiungere qualche dettaglio in più.

hibernate.cache.use_minimal_puts, impostando questo valore su true impedirà di sovrascrivere ciecamente i valori memorizzati nella cache in precedenza, il che risolve i problemi di cache in cluster. secondo il manuale, è abilitato per impostazione predefinita per le implementazioni della cache in cluster.

Hibernate fornisce la proprietà di configurazione hibernate.cache.use_minimal_puts, che ottimizza l'accesso alla cache per le cache in cluster aumentando le letture della cache e diminuendo gli aggiornamenti della cache.

CacheMode.REFRESH sarà bypassare hibernate.cache.use_minimal_puts effetto