簡體   English   中英

如何停止Java或Hibernate緩存

[英]How can I stop Java or Hibernate Caching

我有一個應用程序可以從數據庫中檢索數據,並且可以監視應用程序檢索數據所花費的時間。

但是,當我使用相同的數據輸入集通過我的應用程序檢索數據時,我遇到了一個問題,第二次檢索將花費更少的時間。

我認為Java或Hibernate有一些緩存或臨時文件來保存數據,因此第二次運行會很快,但是我不希望發生這種情況。 我需要監視實際花費的時間,而不是從緩存或臨時文件檢索的時間。

我試圖禁止在Java控制面板中生成緩存和臨時文件,我試圖禁用休眠緩存(第一級或第二級)。 但是這些仍然不能解決我的問題。 第二次運行仍然比需要的時間少。

知道導致第二次運行更快的原因嗎? 它只是一個簡單的應用程序,可從數據庫檢索數據

不能禁用休眠一級緩存(請參閱如何禁用休眠緩存 )。 如果要強制 Hibernate查詢數據庫,則需要了解Hibernate的會話緩存。

Lokesh Gupta在http://howtodoinjava.com/2013/07/01/understanding-hibernate-first-level-cache-with-example/上有很好的教程

  1. 一級緩存與“會話”對象關聯,應用程序中的其他會話對象看不到它。
  2. 緩存對象的范圍是會話。 一旦會話關閉,緩存的對象將永遠消失。
  3. 默認情況下,第一級緩存處於啟用狀態, 您不能禁用它
  4. 當我們第一次查詢實體時,它是從數據庫中檢索出來的,並存儲在與休眠會話相關的一級緩存中。
  5. 如果我們使用相同的會話對象再次查詢相同的對象則會從緩存中加載該對象, 並且不會執行任何SQL查詢。
  6. 可以使用evict()方法從會話中刪除已加載的實體。 如果已使用evict()方法刪除了該實體,則該實體的下一次加載將再次進行數據庫調用。
  7. 可以使用clear()方法刪除整個會話緩存。 它將刪除所有存儲在緩存中的實體。

因此,您應該使用evict()clear()方法將查詢強制到數據庫。

為了驗證這一點,您可以使用hibernate.show_sql配置屬性打開SQL輸出(請參閱https://docs.jboss.org/hibernate/orm/5.0/manual/en-US/html/ch03.html#configuration -optional )。

您是否嘗試過禁用數據庫本身的緩存?

我相信Hibernate的一級和二級緩存是特定於Hibernate的,但是數據庫仍將在后台進行緩存。

MySQL-強制不使用緩存來測試查詢速度

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM