Spring JCache регистрирует попадания в кеш - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть метод, для которого я добавил кэш, добавив аннотацию @CacheResult (я фактически создал прокси, потому что не могу изменить исходную реализацию SomethingService):

@Service
public class SomethingServiceProxyImpl implements SomethingService {

    @Autowired
    @Qualifier("somethingService")
    SomethingService somethingService;

    @Override
    @CacheResult(cacheName = "somethingCache", exceptionCacheName = "somethingExceptionCache", cachedExceptions = { SomeException.class })
    public SomePojo someMethod(String someArg) {
        return somethingService.someMethod(someArg);
    }
}

ЧтоТеперь мне нужно, чтобы иметь возможность регистрировать попадания в кеш, то есть случаи, когда возвращаемый результат был тот из кеша.Я посмотрел на Spring Cache, на JCache и EHCache (реализацию, которую я использую), и я нашел только способ прослушать (со слушателями) следующие события: CREATED, UPDATED, REMOVED, EVICTED, EXPIRED, но ни у одного из них нетсобытие, когда кеш возвращает результат (не ноль).

Я действительно не хочу менять реализацию, чтобы использовать кэш программно, а не использовать аннотации (у меня действительно есть много служб, которые нужно изменить, не только один), есть ли хороший способвсе равно регистрировать эти события?

1 Ответ

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

Мысли об этой теме.Вероятно, первые два наиболее релевантны:

Не : код, который выполняется в Spring и соответствующий кэш при попадании в кэш, является наиболее критичным для производительности.Вот почему не так умно позволять вызывать дополнительный код в этом случае или даже иметь возможность для этого.Проводка в журнале сильно повлияет на вашу производительность.Обычно в приложение уже входит логин для всего, что приводит к запросу кеша (например, входящие веб-запросы).Чтобы понять, правильно ли работает кеш, достаточно счетчика посещений.Это доступно через JCache JMX Statistics.

Адаптер журналирования : Используя Spring, вы можете написать адаптер Cache, который будет регистрировать, как вам нужно, и подключить его через конфигурацию.Грубая идея: посмотрите на интерфейсы CacheManager и Cache.Оберните CacheManager метод создания кэша и верните упакованный кеш с ведением журнала.

Взлом через ExpiryPolicy : Когда пользовательский ExpiryPolicy указан, реализация JCache вызывает метод getExpiryForAccess onкаждый доступ к кешу.Однако вы не получаете никакой информации о фактическом запрашиваемом ключе.Я также рекомендую держаться подальше от собственных реализаций ExpiryPolicy из-за соображений производительности.Так что это просто для полноты.

Регистрация кэша / запись каждого доступа : если вы укажете несколько кэшей, Spring вызывает их один за другим.Вы можете подключить фиктивный кеш в качестве первого кеша, который просто регистрирует доступ.

...