Utilizzo la cache di secondo livello e la cache di query. Posso sapere come cancellare a livello di codice tutte le cache?Come cancellare tutta la cache di Hibernate (ehcache) usando Spring?
risposta
Per cancellare usare la cache di sessione session.clear()
Per cancellare l'uso della cache di 2 ° livello this code snippet
Se si collega Terracotta, hai anche la possibilità di eseguire il Dev Console di terracotta che può controllare le statistiche sul cache, accendi e spegni la cache e cancella i contenuti della cache dall'interfaccia utente.
Questa funzionalità è disponibile anche da bean JMX.
Il frammento di codice indicato nel Bozho risposta è deprecato in Hibernate 4.
Secondo Hibernate JavaDoc, è possibile utilizzare org.hibernate.Cache.evictAllRegions()
:
dati Evict da tutte le regioni di query.
Utilizzando l'API:
Session session = sessionFactory.getCurrentSession();
if (session != null) {
session.clear(); // internal cache clear
}
Cache cache = sessionFactory.getCache();
if (cache != null) {
cache.evictAllRegions(); // Evict data from all query regions.
}
In alternativa, è possibile cancellare tutti i dati da un ambito specifico:
org.hibernate.Cache.evictCollectionRegions()
org.hibernate.Cache.evictDefaultQueryRegion()
org.hibernate.Cache.evictEntityRegions()
org.hibernate.Cache.evictQueryRegions()
org.hibernate.Cache.evictNaturalIdRegions()
si potrebbe voler controllare the JavaDoc for hibernate Cache interface (Hibernate 4.3).
E inoltre, second-level cache eviction dalla guida di ibernazione dev (4.3).
Desidero cancellare i dati della cache dalla cache di secondo livello chiamando il seguente metodo: - sessionFactory.getCache(). EvictEntityRegions(); Voglio solo sapere, c'è qualche danno nel fare questo? Ad esempio: - Cosa succederà se provo a svuotare la cache nel mezzo della transazione? –
Suppongo che dipenda dalla strategia di caching e dal provider. Potrebbe essere necessario testarlo con il prescelto. Il documento di riferimento descrive le diverse impostazioni. – Dino
Sto usando @Cache (usage = CacheConcurrencyStrategy.READ_WRITE). Ho un caso.Suppongo se alcune transazioni sono in esecuzione per ottenere Dati da e la cache di 2 ° livello ha dati in quel momento. Allo stesso tempo, un altro thread rimuove tutte le cache regionali mentre la transazione precedente non è ancora completata. Quindi cosa accadrà in questo caso. Posso ottenere null dalla cache in quella transazione e si verificherà un db hit? C'è qualche possibilità di problemi? –
si può andare con questo anche
request.getSession().invalidate();
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
HttpSessione e sospensione sono diverse cose. –
Se si desidera cancellare la cache di 2 ° livello, utilizzare API sessionFactory.evictEntity(entityName)
Codice:
/**
* Evicts all second level cache hibernate entites. This is generally only
* needed when an external application modifies the database.
*/
public void evict2ndLevelCache() {
try {
Map<String, ClassMetadata> classesMetadata = sessionFactory.getAllClassMetadata();
for (String entityName : classesMetadata.keySet()) {
logger.info("Evicting Entity from 2nd level cache: " + entityName);
sessionFactory.evictEntity(entityName);
}
} catch (Exception e) {
logger.logp(Level.SEVERE, "SessionController", "evict2ndLevelCache", "Error evicting 2nd level hibernate cache entities: ", e);
}
}
Per maggiori dettagli sulla cache di 2 ° livello refer
Per le versioni moderne di Hibernate, sarebbe meglio seguire la @ dino's risposta. – JorgeHortelano