Загрузить содержимое дискового хранилища EhCache в память

Как сказано в документации EhCache:

На практике это означает, что постоянный кэш в памяти запустится со всеми его элементами на диске. [...] Таким образом, дизайн Ehcache не загружает их все в память при запуске, а лениво загружает их по мере необходимости.

Я хотел бы, чтобы кеш памяти запускался, все его элементы были в памяти, как я могу этого добиться?

Причина этого в том, что наш веб-сайт осуществляет много обращений к кешу, поэтому при первом посещении веб-сайта у него очень плохое время отклика.


person Matthieu Napoli    schedule 04.05.2012    source источник
comment
Можете ли вы перебрать все записи при запуске?   -  person Peter Lawrey    schedule 04.05.2012
comment
Это то, что я делаю в настоящее время, но способ, которым это делается, очень медленный (я вызываю методы высокого уровня в циклах, и эти методы высокого уровня также делают запросы к БД). Если бы был способ просто перебирать все записи напрямую с помощью EhCache API, это было бы хорошо.   -  person Matthieu Napoli    schedule 04.05.2012


Ответы (1)


Я предполагаю, что все кэшированные элементы находятся в DiskStore, и вы хотите, чтобы они находились в памяти сразу после запуска приложения. В любом случае использование BootStrapCacheLoader и BootstrapCacheLoaderFactory должно быть полезным.

Я просто даю представление, куда мы загружаем DiskStore в память после запуска приложения.

Вы можете реализовать BootstrapCacheLoader, который будет загружать элементы кеша, как показано ниже. Определение метода BootstrapCacheLoader.load(кэш Ehcache) может быть

       //CustomBootstrapCacheLoader implements BootstrapCacheLoader


        List<?> keys = cache.getKeys();

        if ((keys == null) || keys.isEmpty())
        {
            return;
        }

        for (Object key : keys)
        {
           Element el = cache.getQuiet(key);
           cache.removeQuiet(key);
           cache.putQuiet(el);
        }

Вышеупомянутый метод считывает элемент из DiskCache, удаляет его и возвращает обратно, чтобы он оставался в памяти, а версия диска удалялась.

Реализуйте BootstrapCacheLoaderFactory, чтобы

public class CustomBootstrapCacheLoaderFactory extends BootstrapCacheLoaderFactor
{
.
.
@Override
public BootstrapCacheLoader createBootstrapCacheLoader(Properties properties)
{
    CustomBootstrapCacheLoader loader = new CustomBootstrapCacheLoader();
    loader.setAsynchronous(getAsyncFromProperty(properties));

    return loader;
}
.
.
}

Вы можете определить конфигурацию кеша, как показано ниже, с помощью CustomBootstrapCacheLoaderFactory, как показано ниже.

<cache
         name="DummyCacheEl"
         maxElementsInMemory="3500"
         eternal="true"
         overflowToDisk="false"
         diskPersistent="true"
         memoryStoreEvictionPolicy="LRU">
         <bootstrapCacheLoaderFactory class="CustomBootstrapCacheLoaderFactory"  properties="async=true"/>
</cache>  
person Chandra    schedule 09.05.2012
comment
+1 для BootstrapCacheLoader. Небольшое предложение в вашем коде по удалению с диска и загрузке их в память Element el = cache.removeAndReturnElement(key); Я бы рекомендовал этот подход, а не получение, а затем удаление элемента. - person Sridhar G; 09.05.2012
comment
Верно, но уведомляет CacheEventListener . Может не потребоваться при начальной загрузке кеша. - person Chandra; 09.05.2012
comment
Да, так что в случае, если для этого кеша не настроен уведомитель, это поможет повысить производительность. - person Sridhar G; 09.05.2012
comment
Ага. Кроме того, мы должны загружать кеш асинхронно (создавать поток в методе loadcache), чтобы он теперь блокировал запуск экземпляра. - person Chandra; 09.05.2012
comment
removes it and Puts it back so that it stays in the memory and disk version is removed. Я не хочу удалять элементы из кеша диска? Я просто хочу, чтобы они были загружены в память. - person Matthieu Napoli; 11.05.2012
comment
Прохладно. Элемент el = cache.getQuiet(key); Этот оператор сам по себе должен позаботиться об этом. - person Chandra; 11.05.2012