Протоколирование запросов Ehcache get

#java #caching #ehcache #terracotta

#java #кэширование #ehcache #терракотовый

Вопрос:

Я пытаюсь написать класс, который отслеживал бы все запросы Ehcache GET. Для одержимых производительностью — это будет включено только для целей отладки.

Я вижу следующие три доступных варианта:

1) напишите реализацию net.sf.ehcache.event.CacheEventListener . Это был бы мой предпочтительный способ, но у него есть только PUT / REMOVE / etc. крючки. Нет GET. Ого!

2) напишите реализацию net.sf.ehcache.statistics.CacheUsageListener . Проблема с этим подходом заключается в том, что этот интерфейс больше предназначен для статистики и даже не предоставляет доступ к таким вещам, как текущий ключ / элемент кэша, поэтому мне пришлось бы делать ужасные хаки (например: совместное использование состояния ThreadLocal ), чтобы достичь того, чего я хочу. Фу!

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

Есть ли какие-либо другие варианты, которые я пропустил?

Ответ №1:

Четвертым вариантом было бы включить ведение журнала на уровне отладки для net.sf.ehcache.Кэшируйте и включайте статистику кэша для кэшей, которые вы хотите отслеживать информацию. Затем вы получите «Cache: » getName() » попадание в хранилище для » key» или «configuration.getName () » попадание в кэш, но срок действия элемента истек»» операторы журнала… Так же и для промахов.

Комментарии:

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

2. Не уверен, что вы имеете в виду, соединяя две строки вместе, какие строки журнала? Там есть идентификатор потока? Или что-то еще?

3. Если я последую вашему совету, я получу две строки журнала — одну из net.sf.ehcache. Кэш и другой из класса статистики кэша. Если существует много других операций кэширования, сопоставление двух строк журнала может оказаться затруднительным. Поправьте меня, если я неправильно понял ваш совет.

4. Я думаю, что если вы посмотрите на источник кэша , вы увидите, что searchInStoreWithStats ведет журнал (я думаю), который вы хотите.