在此链接中: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
和List<Location>
,那么为什么要缓存整个DAO?
在幕后,注释@Cacheable
是否将Weather
和List<Location>
转换为静态变量?
答案 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
变量的观点。实质上,从zipCode
到Weather
有一个地图,从locationSearch
到List<Location>
类似。此映射可以来自数据库,文件,外部API等。
您是否要创建一个包含所有可能参数的映射作为键和相应的值?当然,你可以,但它有几个缺点:
你在你的堆上施加了很大的压力。在许多情况下,数据量可能永远不会适合内存,甚至不适合您的磁盘(想想:通过存储每个可能的搜索查询和点击列表来缓存Google搜索引擎)
您很可能永远不会使用大多数密钥。为什么要将它们存储在内存中?
驱逐怎么办?我敢打赌,这些方法往往会为同一个邮政编码返回不同的天气...
由于我不完全理解你的论点,让我简要解释一下调用getWeather()
时幕后发生的事情:
透明代理拦截getWeather()
来电并查找weatherCache
在该缓存中,它使用zipCode
参数作为缓存键
如果存在此类条目(Weather
类型),则会立即返回
如果不是上述情况,则将控制委托给真正的getWeather()
方法。它可以调用一些API,运行数据库查询或进行一些冗长的计算
getWeather()
的结果放在weatherCache
中供将来参考。
此处不涉及static
。
BTW Spring 3.1 introduced caching abstraction layer可能会使此Google代码项目过时。它看起来一样,并允许与不同的缓存实现无缝集成。