Указание глобальной емкости EhCache

Я пытаюсь перенести код моего проекта из OSCache в EhCache.

Мы использовали OSCache не только в качестве поставщика кэша Hibernate второго уровня, но и для хранения других объектов другой природы. Все они счастливо использовали один и тот же экземпляр кэша без каких-либо коллизий из-за неперекрывающихся ключей кэша.

Одно большое отличие при переходе к EhCache заключается в том, что у каждого региона свой экземпляр кэша. Это потенциально хорошо, так как может улучшить скорость поиска, так как данные различной природы находятся отдельно. К сожалению, это имеет цену конфигурации ада. Позволь мне объяснить.

В мире OSCache я бы сконфигурировал емкость своего кэша, скажем, 10000. Теперь, если для конкретной установки потребуется / может быть больше оперативной памяти, я легко увеличу ее до 50000, и это подойдет. Теперь в EhCache мне нужно перейти и изменить настройку по частям этой дельты для каждого региона!

Кроме того, в одной установке может быть более широкое использование объектов типа X, в то время как в другой установке может быть предпочтительнее более высокий отток объектов типа Y. У нас есть десятки установок, и каждая установка будет иметь сотни различных кэшей. Для этого нам пришлось бы нанимать кучу людей, которые просто занимались мониторингом шаблонов кеша и настройкой параметров!

я ожидал CacheManager иметь какую-то глобальную настройку емкости кеша, и каждый внутренний кеш будет бороться за большую емкость, в зависимости от использования записи. Однако я нашел единственный способ установить емкость кеша через CacheConfiguration что много против одного CacheManager,

Пока единственная возможность, которую я вижу, это попытаться заставить Hibernate использовать один глобальный кеш для всех сущностей. Кто-нибудь знает, как это сделать? Есть ли другие, лучшие решения для моего сценария?

1 ответ

Решение

Вы можете попробовать иметь один кеш и добавлять декораторы вокруг него. Декораторы могут иметь имена, совпадающие с именами вашего региона, так что hibernate может использовать эти кэши, но эти декораторы будут использовать тот же самый кэш внизу. Таким образом, есть только одна конфигурация кеша для управления. Вы можете достичь этого, внедрив пользовательские декораторы кеша и настроив имена ваших декорированных кешей.

Вы можете иметь ehcache.xml что-то вроде этого:

<defaultCache maxElementsInMemory="10000" eternal="false"
    overflowToDisk="false"/>

<cache name="singleSharedCache" maxElementsInMemory="2000"
    eternal="false" overflowToDisk="false">
    <cacheDecoratorFactory class="com.xyz.util.CustomEhcacheDecoratorFactory"
        properties="name=org.hibernate.tutorial.domain.Person" />
    <cacheDecoratorFactory class="com.xyz.util.CustomEhcacheDecoratorFactory"
        properties="name=org.hibernate.tutorial.domain.Event" />
</cache>

"Com.xyz.util.CustomEhcacheDecoratorFactory" - это пользовательский класс фабрики декораторов ehcache, который используется для создания декорированных кэшей. Вы можете использовать атрибут "properties" для настройки декорированного ehcache любым способом, здесь вы используете только свойство name для настройки имени нового декорированного ehcache. Все остальные операции могут быть делегированы в базовый кеш.

Предоставляя один пользовательский декоратор кэша, который будет работать для этого варианта использования, он повторно использует EhcacheDecoratorAdapter, который входит в jar ehcache, и просто переопределяет getName(). EhcacheDecoratorAdapter делегирует все операции базовому ehcache, который вы передаете в конструктор:

пакет com.xyz.util;

импорт java.util.Properties;

import net.sf.ehcache.Ehcache;
import net.sf.ehcache.constructs.CacheDecoratorFactory;
import net.sf.ehcache.constructs.EhcacheDecoratorAdapter;

открытый класс CustomEhcacheDecoratorFactory extends CacheDecoratorFactory {

    общедоступный Ehcache createDecoratedEhcache (окончательный кэш Ehcache,
            Свойства конечных свойств) {
        вернуть новый EhcacheDecoratorAdapter(кеш) {
            private final String name = properties.getProperty("name");

            public String getName() {
                вернуть имя;
            }
        };
    }

    общедоступный Ehcache createDefaultDecoratedEhcache(окончательный кэш Ehcache,
            Свойства конечных свойств) {
        вернуть новый EhcacheDecoratorAdapter(кеш) {
            private final String name = properties.getProperty("name");

            public String getName() {
                вернуть имя;
            }
        };
    }
}

Другие вопросы по тегам