【问题标题】:Why cache entire POJO if we only need to cache a particular object如果我们只需要缓存一个特定的对象,为什么要缓存整个 POJO
【发布时间】:2013-01-15 03:35:27
【问题描述】:

在此链接中:http://code.google.com/p/ehcache-spring-annotations/wiki/UsingCacheable 他们说:

When the above POJO is defined as a bean in a Spring IoC container, the bean instance can be made 'cacheable' by adding merely one line of XML configuration.

如果不使用缓存框架,我只需将 Weather 和 List 声明为静态,这样就可以处理缓存。

所以我的问题是,如果我只想缓存 WeatherList<Location>,那我为什么要缓存整个 DAO?
同样在幕后,注解@Cacheable 是否将WeatherList<Location> 变成静态变量?

【问题讨论】:

  • "Weather 和 List as static" - 这些是类,你的意思是 *getWeather()` 和 findLocations() static*"。另外你怎么看做点什么static可以帮到你吗?

标签: java caching ehcache


【解决方案1】:

这是有问题的代码:

public interface WeatherDao {

    public Weather getWeather(String zipCode);

    public List<Location> findLocations(String locationSearch);
}

public class DefaultWeatherDao implements WeatherDao {

    @Cacheable(cacheName="weatherCache")
    public Weather getWeather(String zipCode) {
        //Some Code
    }

    @Cacheable(cacheName="locationSearchCache")
    public List<Location> findLocations(String locationSearch) {
        //Some Code
    }
}

我不太明白你关于static 变量的观点。本质上,有一个从zipCodeWeather映射,以及从locationSearchList&lt;Location&gt; 的类似映射。该地图可以来自数据库、文件、外部 API 等。

您想创建一个包含所有可能参数作为键和对应值的映射吗?当然可以,但它有几个缺点:

  • 你给你的堆施加了很大的压力。在许多情况下,数据量可能永远无法放入内存,甚至无法放入您的磁盘(想想:通过存储所有可能的搜索查询和命中列表来缓存 Google 搜索引擎)

  • 您很可能永远不会使用大多数键。为什么要将它们存储在内存中?

  • 驱逐呢?我敢打赌,随着时间的推移,这些方法往往会为相同的邮政编码返回不同的天气......

由于我不完全理解您的论点,让我简要解释一下调用getWeather() 时幕后发生的事情:

  • 透明代理拦截getWeather()调用并查找weatherCache

  • 在该缓存中,它使用zipCode 参数作为缓存键

  • 如果存在此类条目(Weather 类型),则立即返回

  • 如果不是上述情况,则将控制权委托给真正的getWeather() 方法。它可以调用一些 API、运行数据库查询或进行一些冗长的计算

  • getWeather() 的结果放在weatherCache 中以供将来参考。

这里不涉及static


顺便说一句 Spring 3.1 introduced caching abstraction layer 这可能会使这个 Google Code 项目过时。它看起来一样,并允许与不同的缓存实现无缝集成。

【讨论】:

  • 谢谢。但是为什么我需要缓存整个 DAO?我只需要 cahce 地图
  • @Kaushik:我不明白你所说的“缓存整个 DAO”是什么意思。您将每个方法分别缓存在单独的“地图”中
  • 当他们说:bean 实例可以被“缓存”......什么是 bean 实例? “天气”豆?
猜你喜欢
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多