我们在我们的项目中使用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