Domanda

Mi chiedo se sia possibile per Hibernate cache di secondo livello (stiamo usando EHCache) consentire a un'applicazione di memorizzare nella cache un'entità che è stata trasferita nel DB se sa che nessun'altra applicazione sta modificando il DB.

/ p>

Il mio pensiero è che se aggiorno il record A, allora conosco il valore del record A e dovrei essere in grado di memorizzarlo nella cache, i sistemi di clustering JVM come Terracotta supportano questo tipo di comportamento in termini di memoria heap JVM utilizzando i blocchi di sincronizzazione Java.

Configurazione della modalità di blocco EHCache in Hibernate

È stato utile?

Soluzione

Il libro POJO in Action all'avanguardia ne parla

  

Se un'applicazione a server singolo aggiorna il database utilizzando il framework di persistenza, il framework aggiorna la cache a livello di processo.

E ...

  

Gli oggetti memorizzati nella cache che sono aggiornabili dovrebbero in genere utilizzare un blocco ottimistico perché ciò impedirà all'applicazione di sovrascrivere ciecamente le modifiche nel database. E se una transazione aggiorna un oggetto memorizzato nella cache che era già stato modificato nel database, l'errore di blocco ottimistico causerà il rollback della transazione. Il framework di persistenza rimuoverà i dati non aggiornati dalla cache e l'applicazione può ritentare la transazione con l'ultima versione dei dati.

E scegli una delle seguenti strategie secondo l'APP con il libro Hibernate

  • Transazionale: disponibile solo in un ambiente gestito, garantisce la piena isolamento transazionale fino a lettura ripetibile, se necessario. Usa questa strategia per leggere principalmente dati laddove è fondamentale prevenire dati non aggiornati in transazioni simultanee, nel raro caso di un aggiornamento.
  • Lettura / scrittura: questa strategia mantiene l'isolamento impegnato nella lettura, usando un timestamp meccanismo ed è disponibile solo in ambienti non cluster. Ancora una volta, utilizza questa strategia per la maggior parte dei dati di lettura in cui è fondamentale prevenire i dati obsoleti nelle transazioni simultanee, nel raro caso di un aggiornamento.

Aggiunto alla risposta originale: Hibernate NON GARANTISCE la coerenza tra la cache e il database se si utilizza @Cache (use = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE). Se si desidera utilizzarlo, è necessario configurare un timeout di scadenza sufficientemente breve che può influire sulle prestazioni.

saluti,

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