我们在项目中使用了 hibernate4 和 ehcache。我们主要处理不可变对象(immutable对象),因此缓存是一个非常适合我们应用程序的功能。在尝试启用查询缓存时,我们遇到了以下问题:
假设我们有以下实体:
@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,而不是二级缓存。
有没有办法强制查询也更新二级缓存?也许这种情况要以不同的方式处理?
最佳答案
请参阅二级缓存是针对您指定用于缓存的对象/Pojo。但是查询缓存是为特定查询创建的。因此,两者不相关似乎很自然,并且当您的查询缓存更新时,二级缓存不会更新。这就是为什么它们都有不同的配置。您可以引用 Hibernate Documentation或 this link或 this link可能会帮助您理解事物。
关于java - hibernate 缓存 : Are objects returned by a cached query stored in L2 cache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14987050/