缓存Spring/Hibernate Web应用程序

3
我有一个网站,可以通过各种方式搜索内容列表,例如“按日期排序显示用户523创建的内容”或“显示最近10篇文章的列表”。
我使用Hibernate作为ORM,并且Hibernate提供对象缓存。但是对于像最新内容的首页列表这样的对象列表,我不知道如何最好地缓存该内容。目前,我的Spring控制器只返回标准JSP页面,然后我在调用另一个类的同时在JSP级别上使用oscache进行包装。
虽然这种方法看起来不够优雅。我真正想要的是,如果可用,则使控制器可以访问缓存结果,以便JSP只关注显示结果。
这里有哪些选择?
2个回答

3

您的意思是除了实体之外,您希望缓存Hibernate查询结果。如果是这样,那么您需要查看查询缓存


并不完全是这样。查询缓存看起来很不错,但在许多情况下也很有限且容易频繁刷新。我希望以更通用的方式缓存DAO的任意调用,但我确定那正是我想要的。我只是有点好奇是否存在我不知道的标准技术。例如,Stack Overflow可能使用什么来呈现其主页,或者每次访问都会触发数据库读取? - Brandon Yarbrough
我认为你可能对查询缓存不够了解,我没有发现它有限制,并且它的清除过于频繁,因此需要像任何缓存技术一样进行调整和配置。 - skaffman

0

对于这种缓存,Hibernate将问题分为两个级别:

  1. 与查询相对应的ID列表:此结果可能以多种方式发生变化。例如,如果查询使用的任何表发生更改,则结果可能会更改。无论是否有效更改都很难计算和维护最新状态,因此在大多数情况下效率低下。因此,Hibernate选择不缓存与查询相对应的ID
  2. 一旦已知与查询相对应的ID列表,还需要返回的所有实体及其对应的所有数据(或组件)。在这里,我们假设您已经决定这些实体足够稳定且读取足够频繁,因此建议对它们进行缓存。这个数据检索完全受益于常规的二级Hibernate缓存

为了提高缓存效率和代码简洁性,我将想要缓存的结果分为两个级别:
  • 仅返回ID的查询(可能还包括未被选择用于二级Hibernate缓存的实体)
  • 通过ID获取的其他数据,以从二级缓存中受益

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接