2010-03-17 24 views

Respuesta

16

Para borrar la caché de sesión utilizar session.clear()

Para borrar la caché utilización segundo nivel this code snippet

+5

Para las versiones modernas de Hibernate, sería mejor seguir el @ dino's responder. – JorgeHortelano

3

Si enchufa terracota, también tiene la capacidad de ejecutar el Dev consola de terracota que puede inspeccionar estadísticas sobre la caché, encienda y apague la caché, y borre los contenidos de la caché de la interfaz de usuario.

Esta funcionalidad también está disponible en los beans JMX.

28

El fragmento de código se indica en la respuesta Bozho está en desuso en hibernación 4.

De acuerdo con Hibernate JavaDoc, puede utilizar org.hibernate.Cache.evictAllRegions():

datos Expulsar de todas las regiones de la consulta.

Uso de la 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. 
} 

Alternativamente, puede borrar todos los datos de un ámbito específico:

org.hibernate.Cache.evictCollectionRegions() 
org.hibernate.Cache.evictDefaultQueryRegion() 
org.hibernate.Cache.evictEntityRegions() 
org.hibernate.Cache.evictQueryRegions() 
org.hibernate.Cache.evictNaturalIdRegions() 

Es posible que desee comprobar the JavaDoc for hibernate Cache interface (Hibernate 4.3).

Y también, second-level cache eviction de hibernate dev guide (4.3).

+0

Quiero borrar los datos de caché de la memoria caché de segundo nivel llamando al siguiente método: - sessionFactory.getCache(). EvictEntityRegions(); Solo quiero saber si hay algún daño al hacer esto? Por ejemplo: - ¿Qué pasará si trato de borrar el caché en medio de la transacción? –

+1

Supongo que depende de su estrategia de almacenamiento en caché y su proveedor. Es posible que deba probarlo con el elegido. El documento de referencia describe las diferentes configuraciones. – Dino

+0

Estoy usando @Cache (usage = CacheConcurrencyStrategy.READ_WRITE). Tengo un caso. Supongamos que se está ejecutando alguna transacción para obtener datos y que la memoria caché de segundo nivel tiene datos en ese momento. Al mismo tiempo, otro hilo expulsa todos los cachés de región mientras que la transacción anterior aún no se ha completado. Entonces, ¿qué pasará en este caso? ¿Puedo obtener un valor nulo de la memoria caché en esa transacción y se producirá un hit db? ¿Hay alguna posibilidad de que surja algún problema? –

-7

se puede ir con esto también

request.getSession().invalidate();  
     response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); 
     response.setHeader("Pragma", "no-cache"); 
     response.setDateHeader("Expires", 0); 
+6

HttpSession e hibernate session son cosas diferentes. –

0

Si desea borrar segundo caché de nivel, utilice la API sessionFactory.evictEntity(entityName)

Código:

/** 
* 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); 
    } 
} 

Para más detalles sobre la memoria caché nivel 2 refer

Cuestiones relacionadas