【问题标题】:Query Cache Hibernate loading entities查询缓存休眠加载实体
【发布时间】:2013-03-18 07:11:55
【问题描述】:

谁能帮我解决这个问题。我使用 Infinispan 作为二级缓存,使用 Hibernate 作为 ORM。我已经打开了 enityt 和查询缓存。

我有两个查询,例如 Q1 是“从 BokkEntity b 中选择 b,其中 b.id 我第一次运行 Q1 时,它将 5 个对象从持久存储加载到缓存中。第一次运行第二个查询会在缓存中加载 7 个对象。虽然前五个对象在两个查询中都很常见。根据我的理解,查询缓存总是只存储 id,然后如果实体缓存在查询缓存中,则在缓存中为对象(由 ids 引用)完成搜索。

所以我的问题是为什么两个 Q2 都再次加载所有对象并且 在我运行 Q2 时覆盖实体缓存中的这些(运行 q1 之后) 第一次。

我已经检查了查询缓存对于任何后续请求是否正常工作。即,如果我重新运行 Q1 或 Q2,则从缓存中访问数据。

这很紧急,我会感谢你的努力。

谢谢

米娜

【问题讨论】:

    标签: hibernate entity second-level-cache infinispan query-cache


    【解决方案1】:

    Hibernate 无法知道它已经有哪些查询结果,除非它之前运行过完全相同的查询。因此,这是预期的行为。

    根据 Hibernate documentation:

    如果您有使用相同参数反复运行的查询, 查询缓存提供了性能提升。

    注意这句话:参数相同

    如果您要求 hibernate 通过 id 检索实体,它可以轻松搜索其缓存。但是对于它之前没有运行过的查询,自上次运行以来可能已经插入了任意数量的东西(它只会在服务器之间失效,它不会添加或更新远程服务器缓存)。

    此外,对于查询,hibernate 过于急于(一件好事)使其查询缓存无效(任何时候发生数据库更新,您都可能会丢失所有缓存的查询结果)。

    他们必须实施以确保您的 2 个查询可以合并和拆分的逻辑将非常复杂,如果不深入了解您的数据库结构和程序逻辑,可能无法实现。

    【讨论】:

    猜你喜欢
    • 2017-08-22
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2015-12-18
    • 2015-10-23
    相关资源
    最近更新 更多