#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 ведет журнал (я думаю), который вы хотите.