我正在尝试使用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;
};
答案 0 :(得分:1)
问题是将t1
,t2
,t3
添加到d1
,而不将更新后的d1
添加到缓存中。每次添加值后映射。必须添加电话:
cache.put(d1Element)
答案 1 :(得分:0)
虽然这不一定正确,但由于它取决于您的设置,因此使用Ehcache确实是最佳实践。在此特定设置中,您的元素被序列化为磁盘(不一定在放置时)。因此,一旦序列化,对象图的任何后续更改都不会反映在DiskStore中。
这适用于仅支持onHeap的存储,但仍建议你放回去,以便将来更改缓存配置,而无需更改代码。