我想第一次从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
,则计数器不会在缓存中更新。我哪里错了。
答案 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;
}