2010-03-17 20 views

risposta

16

Per cancellare usare la cache di sessione session.clear()

Per cancellare l'uso della cache di 2 ° livello this code snippet

+5

Per le versioni moderne di Hibernate, sarebbe meglio seguire la @ dino's risposta. – JorgeHortelano

3

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.

28

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).

+0

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? –

+1

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

+0

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? –

-7

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); 
+6

HttpSessione e sospensione sono diverse cose. –

0

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

Problemi correlati