更新Ehcache中的缓存值

时间:2017-10-30 13:51:41

标签: caching ehcache

我想第一次从DB获取计数,然后更新本地缓存中的计数。对于任何进一步的请求,我需要更新每个请求的内存计数器变量并使用更新的计数。

我使用了Ehcache,以下是我从DB获取的代码:

@Override
@CachePut(cacheNames="countCache", key="#id")
public int getCountFromDB(int id, int length) {

    String sqlstm = "select count(*) from Table where length=:length";
    Map<String, Object> namedParamsMap = new HashMap<String, Object>();
    namedParamsMap.put("idd", idd);
    namedParamsMap.put("length", length);
    Integer li = namedParamJdbcTemplate.queryForObject(sqlstm, namedParamsMap, Integer.class);
    return li;
}

2。我需要用计数器值更新这个cachename。我尝试使用以下方法:

   @CachePut(value = "countCache", key = "#id")
    public long updateCounterCache(int id, long count)
    {
        logger.error("In side ht thew updateCounterCache method "+count);
        return count;
    }

如果我使用新计数调用updateCounterCache,则计数器不会在缓存中更新。我哪里错了。

1 个答案:

答案 0 :(得分:2)

我不确定我会使用缓存。我可能只是将初始值设置为AtomicLong。原因是您似乎没有将值保存回数据库,并且缓存永远不会保证在某些时候不会驱逐该值(但实际上,除非缓存已满,否则Ehcache不会这样做。)

所以这一切都取决于价值对您的重要性。

也就是说,您的问题是getCountFromDB应使用@Cacheable而不是@CachePut。见下文

@Cacheable(cacheNames="countCache", key="#id")
public int getCountFromDB(int id, int length) {
    String sqlstm = "select count(*) from Table where length=:length";
    Map<String, Object> namedParamsMap = new HashMap<>(2);
    namedParamsMap.put("idd", id);
    namedParamsMap.put("length", length);
    Integer li = namedParamJdbcTemplate.queryForObject(sqlstm, namedParamsMap, Integer.class);
    return li;
}