2015-12-08 80 views
1

我有一個應用程序來檢索數據庫中的數據,並監視我的應用程序檢索數據所需的時間。如何停止Java或休眠緩存

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

我假設Java或Hibernate有一些緩存或臨時文件來保存數據,所以第二次運行會很快,但我不希望它發生。我需要監視實際需要的時間,而不是從緩存或臨時文件中檢索時間。

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

任何想法導致第二次跑得更快的原因?它只是一個簡單的應用程序從數據庫檢索數據

+0

另外,根據您運行測試的方式,JVM預熱時間可能會對計時產生重大影響。 –

回答

3

Hibernate的第一級緩存不能被禁用(見How to disable hibernate caching)。您需要了解Hibernate的會話緩存,如果您想要force Hibernate查詢數據庫。

LOKESH古普塔對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)。