2013-03-27 86 views
4

任何人都可以帮我解决这个问题。我将Infinispan用作二级缓存,将Hibernate用作ORM。我打开了enityt和查询缓存。查询缓存休眠加载实体

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

所以我的问题是,为什么这两个Q2再次加载所有的对象和 覆盖这些在实体缓存,而我跑Q2(Q1运行后) 第一次。

我检查过的查询缓存对任何后续请求都正常工作。即,如果我重新运行Q1或Q2,则会从缓存中访问数据。

这是紧急的,我会感激努力。

感谢

米娜

回答

1

Hibernate有没有办法告诉,这导致它已经除非它之前已经运行完全相同的查询的查询。因此这是预期的行为。

每休眠documentation

如果您有遍地跑的查询,使用相同的参数, 查询缓存提供的性能提升。

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

如果您要求hibernate通过id检索实体,它可以轻松地搜索其缓存。但是对于之前没有运行过的查询,自上次运行以来可能已插入任何数量的事件(它仅在服务器上无效,它不会添加或更新远程服务器缓存)。另外,有了查询,hibernate对于使查询缓存无效(任何时候数据库更新发生,你很可能会失去所有缓存的查询结果)都是过分(好东西)。

他们为了确保你的2个查询可以被合并和拆分而必须实现的逻辑将是非常复杂的,如果没有你对数据库结构和程序逻辑的深入了解,这些逻辑将是不可能的。

+0

此外,这似乎是一个关于使用查询缓存的陷阱的好文章:http://tech.puredanger.com/2009/07/10/hibernate-query-cache/引用文章:“主要原因查询缓存通常没有用处,因为表格修改会导致结果不断失效。“ – 2013-06-01 05:01:56