查询缓存Hibernate加载实体

时间:2013-03-27 23:59:01

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

任何人都可以帮我解决这个问题。我使用Infinispan作为二级缓存,Hibernate作为ORM。我打开了enityt和query cache。

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

  

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

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

这很紧急,我将不胜感激。

由于

米娜

1 个答案:

答案 0 :(得分:1)

除非以前运行过完全相同的查询,否则Hibernate无法告知它已经拥有哪个查询结果。因此,这是预期的行为。

根据Hibernate documentation

  

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

注意短语:具有相同的参数

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

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

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