如果我们只需要缓存特定对象,为什么要缓存整个POJO

时间:2013-01-14 19:23:35

标签: java caching ehcache

在此链接中: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>转换为静态变量?

1 个答案:

答案 0 :(得分:0)

这是有问题的代码:

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<Location>类似。此映射可以来自数据库,文件,外部API等。

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

  • 你在你的堆上施加了很大的压力。在许多情况下,数据量可能永远不会适合内存,甚至不适合您的磁盘(想想:通过存储每个可能的搜索查询和点击列表来缓存Google搜索引擎)

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

  • 驱逐怎么办?我敢打赌,这些方法往往会为同一个邮政编码返回不同的天气...

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

  • 透明代理拦截getWeather()来电并查找weatherCache

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

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

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

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

此处不涉及static


BTW Spring 3.1 introduced caching abstraction layer可能会使此Google代码项目过时。它看起来一样,并允许与不同的缓存实现无缝集成。