2017-10-30 8 views
0

DBからのカウントを初めて取得し、ローカルキャッシュのカウントを更新したいとします。それ以上のリクエストがあれば、各リクエストのインメモリカウンタ変数を更新し、更新されたカウントを使用する必要があります。Ehcacheのキャッシュ値を更新する

私はのために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.私はカウンタ値と、このキャッシュ名を更新する必要があります。私は新たなカウントで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はではなく@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; 
} 
関連する問題