0

在此链接中: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 声明为静态的,这将负责缓存。

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

4

1 回答 1

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变量的观点。本质上,有一张from to和类似 from to的地图。此映射可以来自数据库、文件、外部 API 等。zipCodeWeatherlocationSearchList<Location>

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

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

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

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

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

  • 透明代理拦截getWeather()呼叫并查找weatherCache

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

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

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

  • 的结果getWeather()被放置在以weatherCache备将来参考。

这里不static涉及。


BTW Spring 3.1 引入了缓存抽象层,这可能会使这个 Google Code 项目过时。它看起来相同,并允许与不同的缓存实现无缝集成。

于 2013-01-14T19:33:27.650 回答