【问题标题】:spring @Cacheable clarification required on implementationspring @Cacheable 实现时需要澄清
【发布时间】:2014-05-19 03:44:41
【问题描述】:

我对使用 @Cacheable 批注相当陌生。我对我的实施方式有疑问。

在我的应用程序中,我有以下...

public class LovCodeDaoImpl extends AbstractDao implements LovDao {

private static final String CODE_LOV_SQL = 
    " SELECT  " +
    "   code, " +
    "   code_desc value" +
    " FROM repman.code_detail  " +
    " WHERE code_type=?  " +
    " ORDER BY code_seq ";

    @Cacheable(value = "lovs", key = "#code")
    public Map<String, String> getLov(String code) {        

        Map<String, String> codes =                 
            (Map<String, String>) getJdbcTemplate()
                .query(
                    CODE_LOV_SQL
                    ,new Object[]{code} 
                    ,new LovMapExtractor());    

        return codes;
    }
}

我们用来从数据库中检索许多不同的值列表的方法。例如,从我的代码中的不同位置使用 AA 或 BB 或 CC 调用此方法。我想要实现的是将每个不同的地图存储在不同键下的缓存中。

所以我的问题是,每当我传入不同的键时,Spring 会将 Map 存储在不同的缓存中吗?还是每次都会覆盖相同的缓存?如果它没有按我的意愿工作,我该怎么做才能让它按我想要的方式工作。

感谢您的帮助。

【问题讨论】:

    标签: spring spring-mvc caching


    【解决方案1】:

    正如官方documentation 中提到的,您使用@Cacheable 的方式将导致Spring 使用code 作为缓存键。

    也就是说,当你第一次调用带有"AA"的方法时,Spring会正常执行该方法,并将生成的映射存储在缓存中的键"AA"下。使用"AA" 的后续调用将从缓存中返回结果。

    当您使用"BB" 调用该方法时,由于缓存中不存在该键的条目,因此Spring 将再次执行该方法并将结果存储在键"BB" 下的缓存中,而不管已经存在什么不同key下的缓存。

    总之,您配置缓存的方式是正确的。 然而,我可以进一步简化,看起来像

    @Cacheable("lovs")

    因为 Spring 会自动使用方法的参数作为缓存的键

    【讨论】:

      猜你喜欢
      • 2021-12-06
      • 1970-01-01
      • 2011-11-09
      • 2012-07-18
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2012-10-22
      • 2018-08-09
      相关资源
      最近更新 更多