1

在我的 Web 应用程序(Spring 3.1、Hibernate 4)中,我将 Ehcache 用于 Hibernate 二级缓存和 Spring @Cache。我想知道,Hibernate Cache和Spring Cache在哪里使用?

例如,我有几个域类(在数据库中查看)用作屏幕上的查找值。我可以使用 Hibernate 二级缓存以及 Spring @Cache 来缓存它们。

因此,在我的服务层中,如果我使用 Spring @Cache 缓存这些域对象,一旦缓存,我将接收到这些对象而根本不会触及持久层(休眠 HQL 查询)。这是正确的方法吗?

4

2 回答 2

4

取决于您的层架构。

假设您有三个服务(或同一服务中的三个方法),它们都返回一个Customer实体集合,即域对象。如果您在服务层缓存,则单个数据库记录的相同表示很可能会多次存在于缓存中。它们是具有基本相同信息的多个对象。为什么?因为 和 的结果Service.getWhateverCustomers(String)存储Service.getWhateverCustomers(String, Integer)在两个不同的缓存键下。

另一方面,如果您使用 JPA @CachableCustomer注释在实体级别缓存,则无论您从哪个服务或服务方法调用实际检索实体的代码,您的实体都会被缓存。当然,有关 JPA 提供者何时可以/确实缓存实体的规则适用。如果您不熟悉它们,请阅读它们。

希望这能让你知道要走哪条路。如果您有更多问题,请发表后续评论,我将编辑此答案。

于 2012-12-26T21:12:05.540 回答
0

正确的做法是:

  1. 问问自己是否需要处理缓存的复杂性。您的应用程序是否未能达到要求?
  2. 仅当上一个问题的答案是“是”时,分析您的应用程序以找出性能问题所在。
  3. 确定解决步骤 2 中确定的性能问题的适当方法。它可能涉及也可能不涉及缓存以防止代价高昂的操作。如果它确实涉及缓存,那么在哪里缓存以及使用哪个缓存应该非常清楚,因为您将确切地知道您要防止发生什么。

这个故事的寓意是你不缓存,因为它很酷。您缓存性能。而且只有在证明有必要时才优化代码

于 2012-12-27T01:44:44.800 回答