2009-10-19 84 views
3

我有一个网站,允许以各种方式搜索内容列表,例如“显示由用户523按日期排序的东西”或“显示最近10个帖子的列表”。缓存弹簧/休眠Web应用程序

我为我的ORM使用Hibernate,Hibernate为对象提供缓存。不过,对于对象列表,就像最新内容的首页列表一样,我对如何最好地缓存该内容感到茫然。现在,我有我的Spring控制器只返回一个标准的JSP页面,然后在调用另一个类的JSP级别上使用oscache。

虽然这看起来不雅观。我真正想要的是让我的控制器有权访问缓存的结果(如果有),以便JSP可以关注显示结果。

我在这里有什么选择?

回答

3

你的意思是你想缓存hibernate查询的结果,除了实体吗?如果是这样,那么你需要看看query caching

+0

不完全。查询缓存看起来很整洁,但也很有限,在许多情况下容易出现频繁刷新。我希望以某种方式更一般地缓存对DAO的任意调用,但我确定这正是我想要的。我只是想知道是否有任何我不知道的标准技术。例如,堆栈溢出使用什么来呈现其首页,或每次访问触发数据库读取? – 2009-10-19 07:54:11

+0

我认为你可能在做缓存服务的查询缓存,我没有发现它是有限的,而且它的刷新过于频繁,那么它需要调整和配置,就像任何缓存技术一样。 – skaffman 2009-10-19 07:55:36

0

对于这个缓存,Hibernate的分割问题在两个层面:

  1. 对应于查询ID列表:这个结果是主题在许多方面改变。例如,如果查询使用的任何表格发生更改,则结果可能会更改。无论是否有效更改将很难计算和保持最新,因此在大多数情况下效率低下。所以Hibernate选择不缓存对应于查询的ID。
  2. 一旦与查询相对应的ID列表已知,则还需要与返回的实体相对应的所有数据,以及所有获取的实体(或组件)。在这里,我们假设你决定这些实体是恒定的,并且足够的读取以便缓存它们是明智的。这个数据检索完全受益于常规的二级Hibernate缓存

缓存效率和简化代码,我分裂这样的结果我想在两个层面缓存:

  • 查询只返回的ID(加上没有选择的可能实体牵强第二级休眠缓存)
  • 由ID读取的其它数据,以从第二级高速缓存中受益