草庐IT

java - hibernate 缓存 : Are objects returned by a cached query stored in L2 cache?

coder 2024-03-13 原文

我们在项目中使用了 hibernate4ehcache。我们主要处理不可变对象(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。这是场景(如果我做出了错误的假设,请纠正我):

  1. 第一次调用查询时(假设缓存为空),执行查询并将返回的 Dog 实例存储在二级缓存中。此外,Dog id 存储在查询缓存中。
  2. 第二次调用查询(Dog id 在查询缓存中,Dog 对象在 L2 缓存中),一切正常。查询缓存返回 ID,Dogs 从 L2 中获取。
  3. 当查询缓存过期(但二级缓存仍然有效)时,查询重新运行并缓存 Dog id。
  4. 现在 Dog 对象的 L2 缓存过期并且所有对象都从缓存中逐出。查询缓存仍然缓存了 id,因此 hibernate 会一个一个地获取 Dog 对象,这需要很长时间。

第三点困扰着我。查询缓存失效并在数据库上重新运行,获取 Dog 对象,但 Dog 对象未在 L2 缓存中更新。看起来查询只更新了查询缓存中的狗 ID,而不是二级缓存。

有没有办法强制查询也更新二级缓存?也许这种情况要以不同的方式处理?

最佳答案

请参阅二级缓存是针对您指定用于缓存的对象/Pojo。但是查询缓存是为特定查询创建的。因此,两者不相关似乎很自然,并且当您的查询缓存更新时,二级缓存不会更新。这就是为什么它们都有不同的配置。您可以引用 Hibernate Documentationthis linkthis link可能会帮助您理解事物。

关于java - hibernate 缓存 : Are objects returned by a cached query stored in L2 cache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14987050/

有关java - hibernate 缓存 : Are objects returned by a cached query stored in L2 cache?的更多相关文章

随机推荐