2010-03-17 65 views

回答

16

要清除會話緩存使用session.clear()

要清除二級緩存的使用this code snippet

+5

對於現代版本的Hibernate,最好遵循@ dino回答。 – JorgeHortelano

3

如果您在兵馬俑堵塞,你還必須運行兵馬俑開發控制檯,它可以檢查有關統計數據的能力緩存,打開並關閉緩存,並清除用戶界面中的緩存內容。

此功能也可從JMX bean獲得。

28

在Bozho答覆中指出的代碼片段在Hibernate中4

據休眠的JavaDoc已被棄用,你可以使用org.hibernate.Cache.evictAllRegions()

逐出數據從所有查詢的區域。

使用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. 
} 

或者,你可以從一個特定的範圍內清除所有數據:

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

你可能要檢查the JavaDoc for hibernate Cache interface (Hibernate 4.3)

還有,來自休眠開發指南(4.3)的second-level cache eviction

+0

我想通過調用以下方法從二級緩存中清除緩存數據: - sessionFactory.getCache()。evictEntityRegions(); 我只是想知道,這樣做有沒有什麼壞處?例如: - 如果我嘗試清除緩存中的交易會發生什麼? –

+1

我想這取決於你的緩存策略和提供者。您可能需要使用所選的測試它。參考文檔描述了不同的設置。 – Dino

+0

我正在使用@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)。 我有一個case.Suppose如果一些事務正在運行,以獲取數據和二級緩存有數據在那個時候。與此同時,另一個線程在上一個事務尚未完成的同時驅逐所有區域高速緩存。那麼在這種情況下會發生什麼。我可以從該事務中的緩存中獲取null,並且會發生數據庫命中?有什麼問題嗎? –

-7

你可以走這也

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

HttpSession和hibernate會話是不同的東西。 –

0

如果你想清除二級緩存,使用API​​ sessionFactory.evictEntity(entityName)

代碼:

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

有關二級緩存refer更多細節