#java #caching #guava
#java #кэширование #guava
Вопрос:
В моем приложении я создаю объект кэша Guava методом CacheBuilder.newBuilder(), и теперь мне нужно динамически настроить для него некоторые параметры инициализации.
Поскольку я не нахожу никакого метода перестроения для кэша guava, я должен перестроить новый.
Мой вопрос :
-
Кто-нибудь научит меня
how to release the old one
? Я тоже не нахожу никакого полезного метода.Я просто вызываю cache.invalidateAll() для старого, чтобы сделать недействительными все ключи.Is there any risk for OOM
? -
Поскольку кэш может использоваться в многопоточности, необходимо ли объявлять кэш как
volatile
?
мои коды приведены ниже:
private volatile LoadingCache<Long, String> cache = null;
private volatile LoadingCache<Long, String> oldCache = null;
public void rebuildCache(int cacheSize, int expireSeconds) {
logger.info("rebuildCache start: cacheSize: {}, expireSeconds: {}", cacheSize, expireSeconds);
oldCache = cache;
cache = CacheBuilder.newBuilder()
.maximumSize(cacheSize)
.recordStats()
.expireAfterWrite(expireSeconds, TimeUnit.SECONDS)
.build(
new CacheLoader<Long, String>() {
@Override
public String load(Long id) {
// some codes here
}
}
);
if (oldCache != null) {
oldCache.invalidateAll();
}
logger.info("rebuildCache end");
}
public String getByCache(Long id) throws ExecutionException {
return cache.get(id);
}
Ответ №1:
Вам не нужно делать ничего особенного, чтобы освободить старый объект; он будет собирать мусор, как и любой другой объект. Вероятно, вам следует пометить кэш как volatile или, что еще лучше, AtomicReference, чтобы несколько потоков не заменяли кэш одновременно. Тем не менее, oldCache должен быть переменной внутри метода, а не класса.