Указание глобальной емкости EhCache - PullRequest
1 голос
/ 15 декабря 2010

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

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

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

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

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

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

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

1 Ответ

2 голосов
/ 22 декабря 2010

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

У вас может быть что-то вроде ehcache.xml: </p> <pre><code><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, который используется для создания декорированных ehcaches. Вы можете использовать атрибут "properties", чтобы настроить декорированный ehcache любым способом, здесь вы используете только свойство name, чтобы настроить имя нового декорированного ehcache. Все остальные операции могут быть делегированы в базовый кеш.

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


package com.xyz.util;

import java.util.Properties;

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

public class CustomEhcacheDecoratorFactory extends CacheDecoratorFactory {

    public Ehcache createDecoratedEhcache(final Ehcache cache,
            final Properties properties) {
        return new EhcacheDecoratorAdapter(cache) {
            private final String name = properties.getProperty("name");

            public String getName() {
                return name;
            }
        };
    }

    public Ehcache createDefaultDecoratedEhcache(final Ehcache cache,
            final Properties properties) {
        return new EhcacheDecoratorAdapter(cache) {
            private final String name = properties.getProperty("name");

            public String getName() {
                return name;
            }
        };
    }
}

...