我们的项目中使用了hibernate4和ehcache。我们主要处理不可变对象,因此缓存是一个很好的特性。在尝试启用查询缓存时,我们遇到了以下问题:
假设我们有以下实体:
查询缓存的timeToLive设置为Dog timeToLive的3/4左右。以下是情景描述(如果我有错误的假设,请纠正我):
是否有一种方法可以强制查询同时更新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设置为Dog timeToLive的3/4左右。以下是情景描述(如果我有错误的假设,请纠正我):
- 第一次调用查询时(假设缓存为空),它会被执行并返回的Dog实例存储在二级缓存中。此外,Dog的id也存储在查询缓存中。
- 第二次调用查询时(Dog的id在查询缓存中,而Dog对象在L2缓存中),一切正常。查询缓存返回id,Dogs从L2中获取。
- 当查询缓存过期时(但L2缓存仍然有效),查询会重新运行并缓存Dog的id。
- 现在,Dog对象的L2缓存过期,并且所有对象都已从缓存中删除。查询缓存仍然具有缓存的id,因此Hibernate逐个逐个地获取Dog对象,这需要很长时间。
是否有一种方法可以强制查询同时更新L2缓存?也许应该以不同的方式处理这种情况?