[英]Hibernate cache: Are objects returned by a cached query stored in L2 cache?
我們在項目中使用了hibernate4和ehcache 。 我們主要處理不可變的對象,因此緩存是一項非常適合我們的應用程序的功能。 在嘗試啟用查詢緩存時,我們遇到了以下問題:
假設我們具有以下實體:
@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。 這是場景(如果我做錯了假設,請糾正我):
第三點困擾着我。 查詢緩存無效,並在數據庫上重新運行,以獲取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.