簡體   English   中英

休眠緩存:緩存查詢返回的對象是否存儲在L2緩存中?

[英]Hibernate cache: Are objects returned by a cached query stored in L2 cache?

我們在項目中使用了hibernate4ehcache 我們主要處理不可變的對象,因此緩存是一項非常適合我們的應用程序的功能。 在嘗試啟用查詢緩存時,我們遇到了以下問題:

假設我們具有以下實體:

@Entity 
@Table(name = "DOGS")
@Immutable 
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
class Dog {
  @Id @Column
  Long id;
  @Column
  String name;
}

和查詢:

Criteria criteria = session.createCriteria(Dog.class);
criteria.add(Restrictions.in("id", ids));
criteria.setCacheable(true);

查詢緩存timeToLive設置為Dog timeToLive的3/4。 這是場景(如果我做錯了假設,請糾正我):

  1. 第一次調用查詢(假設緩存為空)時,將執行查詢並將返回的Dog實例存儲在第二級緩存中。 另外,Dog ID也存儲在查詢緩存中。
  2. 第二次調用查詢(Dog ID在查詢緩存中,而Dog對象在L2緩存中),一切正常。 查詢緩存返回ID,並且從L2中獲取Dog。
  3. 當查詢緩存過期(但L2緩存仍然有效)時,查詢將重新運行並緩存Dog ID。
  4. 現在,Dog對象的L2緩存過期,並且所有對象都從緩存中逐出。 查詢緩存仍然具有緩存的ID,因此休眠狀態將Dog對象一個接一個地獲取 ,這要花很長時間。

第三點困擾着我。 查詢緩存無效,並在數據庫上重新運行,以獲取Dog對象,但是Dog對象在L2緩存中未更新。 看起來該查詢僅更新了查詢緩存中的狗ID,而不更新了L2緩存。

有沒有一種方法可以強制查詢也更新L2緩存? 也許這種情況將以不同的方式處理?

請參閱第二級緩存是針對您指定用於緩存的對象/ Pojo的。 但是查詢緩存是為特定查詢創建的。 因此看起來很自然,兩者都不相關,並且當查詢緩存更新時,二級緩存也不會更新。 這就是為什么兩者都有不同的配置的原因。 您可以參考Hibernate Documentation此鏈接,或者此鏈接可以幫助您理解。

我嘗試過這個並且過去為我工作以清理L2緩存

//clear the cache entity
sf.getCache().evictEntity(Dog.class,12345); //Entity with 12345 id

//or clear a collection 
sf.getCache().evictCollection("com.package.Dog.getCol",12345); //Collections
//Note: the collection contains the name of the fully qualified class.

//then, run the query

希望能幫助到你

就我而言,我禁用了休眠中的最小放置設置,然后每次SQL發出時,查詢緩存將自動更新所有相關的第二級緩存。

我認為這是您的問題“強制查詢也更新L2緩存”的解決方案(這也困擾了我很長時間.....)

<property name="hibernate.cache.use_minimal_puts" value="false"/>

暫無
暫無

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

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