任何人都可以帮我解决这个问题。我使用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,则从缓存中访问数据。
这很紧急,我将不胜感激。
由于
米娜
答案 0 :(得分:1)
除非以前运行过完全相同的查询,否则Hibernate无法告知它已经拥有哪个查询结果。因此,这是预期的行为。
根据Hibernate documentation:
如果您的查询反复运行,请使用相同的参数, 查询缓存提供了性能提升。
注意短语:具有相同的参数。
如果您要求hibernate通过id检索实体,它可以轻松搜索其缓存。但是,如果查询之前没有运行过,那么自上次运行以来可能已经插入了任意数量的内容(它只会在服务器之间失效,它不会添加或更新远程服务器缓存)。
此外,对于查询,hibernate对于使其查询缓存失效非常过分(一件好事)(任何时候发生数据库更新都可能会丢失所有缓存的查询结果。)
他们必须实现的逻辑类型才能确保您的2个查询可以合并和拆分,这将非常复杂,如果没有对数据库结构和程序逻辑的深入了解,可能无法实现。