Ehcache 2.4.2不会将元素中的所有值都写入文件

时间:2011-08-14 15:10:38

标签: element store ehcache

我正在尝试使用ehcache进行简单测试 - 将一个元素放入缓存中,刷新并关闭缓存。然后用spring重新加载所有bean(也初始化cachemanager)。执行cache.get并检索以前写入的值。

EhCache Element的值是一个名为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 个答案:

答案 0 :(得分:1)

问题是将t1t2t3添加到d1,而不将更新后的d1添加到缓存中。每次添加值后映射。必须添加电话:

cache.put(d1Element)

答案 1 :(得分:0)

虽然这不一定正确,但由于它取决于您的设置,因此使用Ehcache确实是最佳实践。在此特定设置中,您的元素被序列化为磁盘(不一定在放置时)。因此,一旦序列化,对象图的任何后续更改都不会反映在DiskStore中。

这适用于仅支持onHeap的存储,但仍建议你放回去,以便将来更改缓存配置,而无需更改代码。