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

Java 如果只需要缓存特定对象,为什么要缓存整个POJO,java,caching,ehcache,Java,Caching,Ehcache,在此链接中: 他们说: 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声明为static,这样就可以处理缓存了 所以我的问题是,如果我只想缓存天气和列表,那么为什么要缓存整个D

在此链接中: 他们说:

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声明为static,这样就可以处理缓存了

所以我的问题是,如果我只想缓存
天气
列表
,那么为什么要缓存整个DAO?

同样在幕后,注释
@Cacheable
是否将
Weather
List
转化为静态变量?

这就是问题中的代码:

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
    }
}
公共接口{
公共天气getWeather(字符串zipCode);
公共列表查找位置(字符串位置搜索);
}
公共类DefaultWeatherDao实现WeatherDao{
@可缓存(cacheName=“weatherCache”)
公共天气getWeather(字符串zipCode){
//一些代码
}
@可缓存(cacheName=“locationSearchCache”)
公共列表查找位置(字符串位置搜索){
//一些代码
}
}
我不太理解你关于
静态
变量的观点。本质上,有一张从
zipCode
Weather
的地图,类似于从
locationSearch
List
。此映射可以来自数据库、文件、外部API等

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

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

  • 最有可能的是,你永远不会使用大多数钥匙。为什么要将它们存储在内存中

  • 驱逐怎么办?我敢打赌,这些方法往往会在一段时间内为相同的邮政编码返回不同的天气

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

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

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

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

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

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

此处不涉及
静态



顺便说一句,这可能使谷歌代码项目过时。它看起来相同,并且允许与不同的缓存实现无缝集成。

“Weather and List as static”-这些是类,您的意思是
*
getWeather()`和
findLocations()
static*“。另外,您认为制作任何<代码>静态都能帮到您吗?谢谢。但是为什么我需要缓存整个DAO呢?我只需要看一下地图@Kaushik:我不明白你说的“缓存整把刀”是什么意思。当它们说:bean实例可以被设置为“可缓存”…bean实例是什么?“天气”豆?