【问题标题】:automatic query cache invalidation自动查询缓存失效
【发布时间】:2010-09-14 18:08:06
【问题描述】:

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

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

@Cache(使用 = CacheConcurrencyStrategy.READ_WRITE) 类项目 { //剩下的代码... } 类容器{ @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
公共列表 getItems() { ... } //剩下的代码... }

我注意到的问题是,当我:

1) 将数据库中的一些Containers读入内存(连同对应的item)

   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) 重复第一步
然后在第三步中,我看不到我在第二步中插入的项目。 只有在插入新项目后手动清理缓存时才会看到它们:

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

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

提前感谢您的回答。 你好 汤姆

【问题讨论】:

标签: hibernate caching


【解决方案1】:

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

要解决此问题,您只需致电SessionFactory.evictQueries

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 是否愿意在这个答案中至少对主题的问题进行最低限度的解释?
    【解决方案3】:

    是的,本机 SQL 查询不存在查询缓存自动失效。对于 HQL 查询,如果参与查询的任何表对任何对象都有 INSERT/UPDATE/DELETE,则它只是清除所有缓存。

    所以你可以试试Hibernate Dynamic SQL Cache项目,它旨在通过自动更新SQL查询缓存而不失效来解决这个问题。

    附: “比尔蜥蜴”感谢您的理解:)

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 2013-10-03
      • 2011-05-07
      • 2016-09-21
      • 2016-09-06
      • 1970-01-01
      • 2014-04-16
      • 2014-10-22
      相关资源
      最近更新 更多