我們在我們的項目中使用hibernate4和ehcache。我們主要研究不可變的對象,所以緩存是一個非常適合我們應用的功能。嘗試啓用查詢緩存,我們遇到了以下問題:Hibernate緩存:緩存查詢返回的對象是否存儲在L2緩存中?
假設我們有以下的實體:
@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設置爲約3/4的狗timeToLive。這裏的情景(請糾正我,如果我犯了一個錯誤的假設):
- 第一次查詢稱爲(假設緩存爲空),它是執行和返回的狗實例存儲在第二級緩存。另外,Dog ID保存在查詢緩存中。
- 第二次調用查詢(Dog ID位於查詢緩存中,Dog對象位於L2緩存中)時,一切正常。查詢緩存返回id,Dog從L2中獲取。
- 當查詢緩存過期(但L2緩存仍然有效)時,查詢將重新運行並緩存Dog ID。
- 現在二級緩存過期,Dog對象和所有對象都從緩存中逐出。查詢緩存仍然具有緩存的ids,因此hibernate會一個一個獲取Dog對象,這需要永久。
第三個問題是糾纏我。查詢緩存在數據庫中失效並重新運行,獲取Dog對象,但Dog對象未在L2緩存中更新。它看起來像查詢只更新查詢緩存中的狗標識符,而不是二級緩存。
有沒有辦法強制查詢更新L2緩存?也許這種情況需要以不同的方式處理?
您可以啓用讀/寫入緩存模式,以便EHCache在更新時處理它。 – Phani 2013-07-24 17:21:22
該實體是隻讀的,所以這不會有幫助。 – 2013-07-25 10:08:53