2011-04-12 434 views
0

我想知道如何加載和獲得第一級高速緩存。休眠第一級高速緩存

如果我在同一個會話中有一個select查詢,首先使用getmethod進行檢索,然後使用load方法。第二個加載方法會使用查詢緩存還是會對屬性的檢索進行新的查詢?

回答

3

緩存是主要適用於:

  • 調用session.get
  • 調用session.load
  • 時(懶惰)加載許多-to-one和一到一個關係

如果沒有命中,則get執行查詢,load創建代理。

執行任何類型的查詢(HQL,條件)時,查詢將轉換爲SQL並在數據庫上執行。如果在緩存中找到結果對象,則查詢將返回它們。

0

我是新手來休眠。因此,爲了理解hibernate緩存策略,我在get處設置了一個斷點,然後跟隨了調用堆棧。

在文件StatefulPersistanceContext.java中, entitiesByKey,它充當會話級緩存。當你打電話給get()它首先檢查會話級別緩存,如果它未命中,那麼檢查第二級緩存(如果它被設置爲用於該實體)否則它會回退到數據庫。見doLoad()功能和調用loadFromSessionCache()loadFromSecondLevelCache()loadFromDatasource()在DefaultLoadEventListners.java文件

一旦從數據庫中檢索行,它也會填充會話級別緩存。因此,您對get()的後續調用將從會話級高速緩存本身解析。

0

默認情況下啓用一級緩存,我們不需要做任何事情來實現它,實際上我們甚至不能從那裏禁用它。第一級緩存也被稱爲會話級緩存,這意味着它僅適用於會話,以防單個會話中執行兩次或更多次相同的查詢,它僅從第一個請求獲取數據,並提供相同的數據從緩存中爲所有即將到來的類似請求

更多細節:http://www.beingjavaguys.com/2014/11/how-first-level-caching-works-in.html