4

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

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

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

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

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

谢谢

米娜

4

1 回答 1

1

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

根据休眠文档

如果您有使用相同参数反复运行的查询,则查询缓存可以提高性能。

注意这句话:具有相同的参数

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

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

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

于 2013-06-01T04:43:46.943 回答