初めて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.このキャッシュ名をカウンター値で更新する必要があります。私は以下の方法を使ってみました:
@CachePut(value = "countCache", key = "#id")
public long updateCounterCache(int id, long count)
{
logger.error("In side ht thew updateCounterCache method "+count);
return count;
}
updateCounterCache
新しいカウントで呼び出すと、カウンターがキャッシュで更新されません。私はどこが間違っているのですか。
そのためにキャッシュを使用するかどうかはわかりません。おそらく初期値をに設定するだけでしょう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;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加