Как освободить объект кэша гуавы - PullRequest
0 голосов
/ 15 марта 2019

В моем приложении я строю объект Guava Cache методом CacheBuilder.newBuilder (), и теперь мне нужно динамически настроить некоторые параметры инициализации для него.

Так как я не нашел метода перестройки для кэша гуавы, я должен перестроить новый.

Мой вопрос:

  1. Кто-нибудь научит меня how to release the old one? Я не нахожу ни одного полезного метода. Я просто вызываю cache.invalidateAll () для старого, чтобы сделать недействительными все ключи. Is there any risk for OOM?

  2. Поскольку кэш может использоваться в многопоточности, необходимо ли объявлять кэш как 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 Ответ

0 голосов
/ 17 марта 2019

Вам не нужно делать ничего особенного, чтобы освободить старое;он будет собирать мусор, как и любой другой объект.Вы, вероятно, должны пометить кэш как энергозависимый или, что еще лучше, AtomicReference, чтобы несколько потоков не заменяли кэш одновременно.При этом oldCache должна быть переменной внутри метода, а не класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...