Обход аннотации @Cacheable в Production для отладки - PullRequest
0 голосов
/ 22 мая 2011

Я работаю над новым проектом на основе Spring, и мне было интересно, если бы я использовал аннотацию @Cacheable, найденную в Spring 3.1, или в проекте ehcache-spring-annotation , как бы вы реализовать механизм обхода механизма кэширования «по требованию», например для отладки продукции.

Допустим, мое приложение обслуживает только REST-запросы, иногда, мне бы хотелось, чтобы за один вызов (который я выполняю вручную) получить данные непосредственно из «БД» (или того, что когда-либо там было), и избежать и любой кэширование в пути ( любое кэширование). Пока выполняется вызов, я не против, если он заново заполнит кеш тем, что только что получил из базы данных ...

Мне бы хотелось услышать ваши мысли о том, как вы будете реализовывать это.

Заранее спасибо за любые указания,

Кен.

Ответы [ 3 ]

0 голосов
/ 22 мая 2011

Вы можете создать метод, который очищает кэш и запускает его только с вашим отладчиком, когда вы хотите получить значение из БД.

@Cacheable(modelId = "i18NTextCacheModel")
public List<I18NText> loadAll() {

    logger.debug("loadAll called");
    ...
}

@CacheFlush(modelId = "i18NTextFlushModel")
public Long save(I18NText entity) {

    logger.debug("save called");
    ...
}
0 голосов
/ 13 ноября 2018

Получен аналогичный результат, как предложено @Bozho Если параметр запроса refresh-cache = true передан, кеш обойдется

Я расширил DefaultRedisCacheWriter и использовал его в качестве CacheWriter

    RedisCacheManager cacheManager = RedisCacheManager
            .builder(new RefreshableRedisCacheWriter(redisConnectionFactory()))
            .cacheDefaults(cacheConfiguration)
            .build();

Переписать метод get () в этом модуле записи

@Override
public byte[] get(String name, byte[] key) {

    Assert.notNull(name, "Name must not be null!");
    Assert.notNull(key, "Key must not be null!");

    HttpServletRequest request = ApiRequestContext.getRequestContext();
    if (Boolean.valueOf(request.getParameter("refresh-cache"))) {
        logger.info("bypassing cache for key: {}", key);
        return null;
    }

    return execute(name, connection -> connection.get(key));
}

ApiRequestContext - это пользовательский объект запроса, который хранится в локальном потоке. Обратите внимание, что когда этот метод возвращает значение NULL, значение извлекается из базы данных и помещается обратно в кеш, эффективно обновляя кеш.

0 голосов
/ 22 мая 2011

Возможно, вы можете расширить менеджер кэша и предоставить логическое выражение в дополнение к существующим проверкам.

Это логическое значение, которое вы можете установить в ThreadLocal в вашем контроллере, чтобы при каждом вызове службылогическое значение на месте.

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