2017-10-30 1 views
0

DB에서 처음으로 카운트를 가져온 다음 로컬 캐시에서 카운트를 업데이트하려고합니다. 추가 요청에 대해서는 각 요청에 대해 메모리 카운터 변수를 업데이트하고 업데이트 된 카운트를 사용해야합니다. 나는 카운터 값이 cachename를 업데이트해야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; 
} 

2 : 나는 아래에 대한으로 Ehcache를 사용하고있다

는 DB에서 가져 오기 위해 내 코드입니다. 나는 새로운 카운트 updateCounterCache를 호출 할 경우

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

, 카운터가 캐시에 업데이트 점점되지 않은 : 나는 아래의 방법을 사용했습니다. 나는 어디가 잘못 됐어.

답변

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