Caching 更新Ehcache中的缓存值

Caching 更新Ehcache中的缓存值,caching,ehcache,Caching,Ehcache,我想第一次从DB中获取计数,然后更新本地缓存中的计数。对于任何进一步的请求,我需要为每个请求更新内存中的计数器变量,并使用更新的计数 我已经使用了Ehcache,下面是我从数据库获取的代码: @Override @CachePut(cacheNames="countCache", key="#id") public int getCountFromDB(int id, int length) { String sqlstm = "select count(*) from Table w

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

我已经使用了Ehcache,下面是我从数据库获取的代码:

@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;
}

如果使用新计数调用updateCounterCache,则缓存中的计数器不会得到更新。我哪里出了问题。

我不确定我是否会使用缓存。我可能只是将初始值设置为原子长度。原因是,您似乎没有将值保存回数据库,缓存也不能保证在某个时候不会逐出该值,但实际上,除非缓存已满,否则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;
}

我不确定我是否会使用缓存。我可能只是将初始值设置为原子长度。原因是,您似乎没有将值保存回数据库,缓存也不能保证在某个时候不会逐出该值,但实际上,除非缓存已满,否则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;
}