2010-09-30 56 views
27

我想寫一個單元測試類,它將不得不使用相同的查詢來從相同的測試方法中從數據庫中獲取兩次結果。但是,隨着Hibernate緩存第二次啓用,它實際上不會觸及數據庫,只是從緩存中獲取結果。如何禁用休眠緩存

有人可以請回答如何禁用緩存在persistence.xml

我試圖通過更改屬性hibernate.cache.use.query_cache = falsehibernate.cache.use_second_level_cache = false來禁用。

但它沒有奏效。

+1

您是否試圖在同一會話中完成兩個讀取?如果是的話,這種行爲是第一級緩存的預期。沒有看到你的測試案例,很難給你一個確切的答案 – Sean 2010-09-30 04:35:29

回答

18

有人可以請回答如何禁用persistence.xml中的緩存。

的二級緩存和查詢緩存默認情況下禁用(和查詢是不進行緩存,除非你明確緩存它們)。一級緩存不能被禁用。

我試圖通過改變性質(...)

這禁用將禁用如果他們啓用了二級緩存和查詢緩存,

但它沒有工作。

說實話,「沒用」是當前的行爲VS預期的一個非常差的描述。提供更多細節(僞)代碼,SQL跟蹤可能會有所幫助。這就是說,如果問題是關於HQL的,HQL查詢應該在後續執行時(無需任何查詢緩存)肯定會擊中數據庫。如果需要,請激活SQL日誌記錄以觀察此情況。

如果問題是關於Session#get()Session#load(),那麼您可以使用Session#refresh()重新加載實體的狀態或調用Session#clear()以完全清除會話。

+0

對不起,但這沒有幫助。 – 2017-02-10 15:45:26

0

據來自hibenrate隊一個傢伙:

的二級緩存無關 做的第一級(會話或 持久化上下文)高速緩存。由於各種原因,持久性上下文/會話高速緩存 是強制性的。在 事實上,不理解這個關鍵的 部分,並忽略它在應用程序 架構是一種災難的祕訣。 這裏沒有快速解決方案,研究 一些文件。

來源:HTTPS://forum.hibernate.org/viewtopic.php P = 2383408
您可以使用重試前seesion.evict(你的對象)相同的查詢?

6

您可以使用:

session.setCacheMode(CacheMode.IGNORE)

你的後

session.createQuery("from Table")聲明。

這將確保Hibernate不會與此查詢返回的任何實體的二級緩存進行交互。

2

如果您在單元測試中創建了一個新的(不同的)會話,它將「不」使用舊的緩存。或者,如果你在它調用clear()第一個(另一個選項)等

+1

使用clear()已經保存了一天。太感謝了! – 2017-02-10 15:54:56

8

,Hibernate有緩存的兩個層次,

  1. Session緩存(一級緩存)是默認的緩存,沒有機制禁用。

  2. SessionFactory(二級)級別緩存:我們必須在設置cache_provider時通過 配置Hibernate cfg文件。

    我有一個要求從數據庫加載大量數據,並且我使用無狀態會話由於以下功能。

    a. Stateless session does not support session cache and never interact with 
        second level cache. 
    b. Stateless session does not support automatic dirty check. 
    c. Stateless session does not support cascading to associated entities. 
    

    語法創建無狀態會話:

    StatelessSession statelessSession = sessionFactory.openStatelessSession(); 
    
+0

不是'entityManager.clear()'清理所謂的第一級緩存嗎? – Derp 2017-09-04 09:16:11

0

你第一次查詢結果後,需要調用Session.clear,然後在同一查詢將訪問數據庫級別1,而不是高速緩存