Ehcache 2.4.2 не записывает все значения элемента в файл - PullRequest
0 голосов
/ 14 августа 2011

Я пытаюсь сделать простой тест с ehcache - поместить элемент в кеш, очистить и закрыть кеш.Затем перезагрузите все бины с пружиной (также инициализирует cachemanager).Сделайте cache.get и получите ранее записанные значения.

Значением элемента EhCache является некоторый сериализуемый класс, называемый DOM, который содержит поле ConcurrentHasMap

Я создаю 3 экземпляра DOM: d1, d2, d3 d1(имеет карту с 3 значениями: t1, t2, t3) d2 (имеет карту с 2 значениями: x1, x2) d3 (имеет карту с 2 значениями: s1, s2)

Я звоню:

cachemanager and cache are created with spring
cache.put(new Element(1,d1))
cache.put(new Element(2,d2))
cache.put(new Element(3,d3))
cache.flush();
cacheManager.shutdown();
cache = null
cacheManager = null

Я звоню, чтобы загрузить контекст приложения Spring (который создает cacheManager и кэш)

Я звоню:

actualD1 = cache.get(1)
actualD2 = cache.get(2)
actualD3 = cache.get(3)

Я получаю DOM-объекты в actualD1, actualD2и переменные actualD3 Но проблема в том, что теперь у каждой из них есть только одно значение

actualD1 (имеет карту с 1 значением: t1) actualD2 (имеет карту с 1 значением: x1) actualD3 (имеет карту с1 значение: s1)

В чем может быть проблема! ???

Вот мой файл ehcache.xml:

<defaultCache
       maxElementsInMemory="1000000"
       eternal="false"
       diskSpoolBufferSizeMB="100"
       overflowToDisk="true"
       clearOnFlush="false"
       copyOnRead="false"
       copyOnWrite="false"
       diskExpiryThreadIntervalSeconds="300"
       diskPersistent="true">
</defaultCache>

Вот как я могу создать cacheManager(этот метод вызывается при запуске из весны)

protected def checkAndCreateCacheManagerIfNeeded() =
{
    if (cacheManager == null)
    {
        synchronized
        {
            if (cacheManager == null)
            {
                cacheManager = CacheManager.create(ehCacheConfigFile);
            }
        }
    };
};

Следующий код создает кеш:

protected def getOrCreateCache(cacheName : String) =
{
    checkAndCreateCacheManagerIfNeeded();
    var cache = cacheManager.getEhcache(cacheName);
    if (cache == null)
    {
        cacheManager.synchronized
        {
            cache = cacheManager.getEhcache(cacheName);
            if (cache == null)
            {
                cache = cacheManager.addCacheIfAbsent(cacheName);
            }
        }
    };
    cache;
};

Ответы [ 2 ]

1 голос
/ 15 августа 2011

Проблема заключалась в добавлении t1, t2, t3 к d1 без помещения обновленного d1 в кэш.После каждого добавления значения на карту.Нужно добавить звонок:

cache.put(d1Element)
0 голосов
/ 23 августа 2011

Хотя это не обязательно так, поскольку это зависит от ваших настроек, на самом деле считается, что лучше всего делать это с Ehcache.В этой конкретной настройке ваши элементы сериализуются на диск (но не обязательно во время размещения).В результате после сериализации любое последующее изменение в графе объектов не будет отражаться в DiskStore.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...