自动查询缓存失效

时间:2020-03-06 15:00:57  来源:igfitidea点击:

我试图了解休眠查询缓存的工作原理。
我现在看到的是,当我在数据库中插入新实体时,Hibernate不会自动更新其二级缓存(尽管我仅使用Hibernate调用)。
我发现使它起作用的唯一方法是在插入新实体后手动清理缓存。

这是更具体的例子。
我有一个名为Container的持久性实体,其中可以包含许多项。我想缓存所有项目:

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
class Item 
{
  // rest of the code ...
}

class Container {
  @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

  public List getItems() { ... }

  // rest of the code ...
}

我注意到的问题是当我:

1)从数据库中读取一些容器到内存中(以及相应的项)

String hql =
      "from Container c left join fetch c.items where c.type = 1";
   List<Item> list = hibernateTemplate.find(hql);

2)为选定的容器插入新项目

hibernateTemplate.save(item)

3)重复第一步
那么在第3步中,我看不到在第2步中插入的项目。
仅当在插入新项目后手动清理缓存时,我才能看到它们:

sessionFactory.evictCollection("Container.items", updatedContainerId)

我的直觉告诉我,Hibernate应该自动执行这样的缓存失效。有没有人看到它的工作?我是在做错什么,还是只是不支持?

预先感谢回答。
你好
汤姆

解决方案

Hibernate通过使用由查询(或者查询名称)和指定参数的值组成的键来存储来自查询的数据。我猜它不能轻易知道在修改数据时哪个缓存无效。

要解决此问题,我们只需调用SessionFactory.evictQueries。

我们可能会发现我有关查询缓存工作原理的博客有助于我们理解查询缓存的功能以及为什么它可能无法按照我们认为的方式工作:

  • http://tech.puredanger.com/2009/07/10/hibernate-query-cache/