マルチスレッド環境でEhcacheを実装しています。キャッシュの管理と更新専用のスレッドが1つあり、他のスレッドはいつでもそれを呼び出すことができます。
キャッシュは読み取り専用ですが、30分ごとに更新されます。Ehchacheは、キャッシュの更新中に、キャッシュへの読み取りアクセスを自動的に管理およびロックしますか?または、acquireReadLockOnKey()ステートメントでラップする必要がありますか?
Ehcache cache = getCache();
cache.acquireReadLockOnKey(element);
try {
cache.put(element);
}
finally {
cache.releaseReadLockOnKey(element);
}
UDPATE:実装の詳細は次のとおりです。上記のコードは「updateCache()」メソッド用ですが、以下は最初に作成される方法です。
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Ehcache;
public class TTLCacheProviderHelper {
private CacheManager cacheManager = null;
Ehcache myTtlCache = null;
private static final String CACHE_NAME = "myTTLCache";
private static int TTL_VALUE = 1800;
private static EvictTimeClock evictTimeClock = null;
/**
* Constructor
*/
public TTLCacheProviderHelper() {
cacheManager = CacheManager.create();
Cache testCache = new Cache(CACHE_NAME, 100, false, false, 10, 10);
Ehcache originalCache = testCache;
cacheManager.addCache(originalCache);
myTtlCache = cacheManager.getCache(CACHE_NAME);
String ttlValue = AppConfigService.getInstance().getTTL();
if(ttlValue!= null)
TTL_VALUE = Integer.parseInt(ttlValue);
evictTimeClock = new EvictTimeClock();
setEvictTimeClock(TTL_VALUE);
}
Ehcache getCache(){
return myTtlCache;
}`
そしてその設定: `
<cache name="configCache" maxElementsInMemory="100000" eternal="true" overflowToDisk="false" />
<cache name="validationTemporaryCache" maxElementsInMemory="10000"
eternal="false" overflowToDisk="false" timeToIdleSeconds="500"
timeToLiveSeconds="500" />
</ehcache>`