2013-03-23 70 views
1

我使用hibernate + ehcache和正確配置的緩存屬性。在應用程序啓動時,我們初始化緩存並通過ORM向DB發起可能的查詢全部。 如果出現「有效參數組合」,則此功能非常有效 - 否則會導致緩存未命中並因此導致數據庫往返。數據純粹是靜態的。ehcache查詢緩存未命中後禁用數據庫往返?

70%的所有情況都是錯過的,所以如果緩存未命中可以通過查詢/實體級別進行不同對待,我們可以獲得很多收益。

是否有辦法阻止hibernate + ehcache進入數據庫,如果在熱身後發生緩存未命中? hibernate中可能有一個API鉤子?

在理想的情況下,緩存預熱後根本不會執行數據庫訪問。

TIA

弗蘭克

回答

0

考慮您的配置考慮,你有幾種選擇:

  • 終止的Ehcache水平
  • 終止休眠水平
  • 終止在JDBC級別

免責聲明:下面提到的都不是完整的解決方案 - 事實上,它們可能是不可實施的。但我會從那裏開始挖掘。

我不認爲可以在Ehcache級別上做太多的工作,因爲如果元素不存在,緩存層簡單地返回null,Hibernate取回控制並從數據庫中獲取條目。你可能返回一些預定義的值(你知道這是無效的,意味着缺席),但這是一種代碼味道。

在休眠級別,您可以定義一個對LoadEvent有反應的interceptor。不知道這是否可以應用於查詢。

與休眠類似,您可以使用JDBC interceptor。這可能不是理想的,因爲你仍然會有Hibernate開銷,但是這比等待數據庫往返行程(我想每個請求約50毫秒)要好得多。

+0

是的,得出了相同的結論,我同意Hibernate應該可能用於完成所需的行爲。我瞄了一眼休眠Java文檔和我的感覺我不得不面對: * ** ** SingletonEhCacheProvider ...爲切入點,以高速緩存ORM水暖 * QueryKey * StandardQueryCache * StandardQueryCacheFactory * Hibernate攔截器(不知道我在這方面可以從中獲得什麼,將會看到) – user1477398 2013-03-26 09:23:06