我正在尝试使用JCS1.3来创建一个永恒的磁盘缓存。我希望缓存能够关闭,然后在下次使用时从磁盘重新加载。我有很多数据要从一个需要很长时间才能运行的数据库中填充,如果缓存只是从磁盘上重新加载,速度会快得多。我试着通读JCS文档并使用他们的配置示例来开始,但到目前为止还没有成功。下面是我使用的配置
##############################################################
##### Default Region Configuration
jcs.default=DC
jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=100
jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
jcs.default.cacheattributes.DiskUsagePatternName=UPDATE
##############################################################
##### CACHE REGIONS
jcs.region.myRegion1=DC
jcs.region.myRegion1.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.region.myRegion1.cacheattributes.MaxObjects=1000
jcs.region.myRegion1.cacheattributes.DiskUsagePatternName=UPDATE
jcs.region.myRegion1.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
jcs.region.myRegion1.elementattributes.IsEternal=true
##############################################################
##### AUXILIARY CACHES
# Indexed Disk Cache
jcs.auxiliary.DC=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory
jcs.auxiliary.DC.attributes=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes
jcs.auxiliary.DC.attributes.DiskPath=f:/eh cache
jcs.auxiliary.DC.attributes.MaxPurgatorySize=10000
jcs.auxiliary.DC.attributes.MaxKeySize=10000
jcs.auxiliary.DC.attributes.OptimizeAtRemoveCount=300000
jcs.auxiliary.DC.attributes.OptimizeOnShutdown=true
jcs.auxiliary.DC.attributes.MaxRecycleBinSize=7500这是一个非常简单的测试,我正在运行以确保我的配置是正确的。
JCS cache = JCS.getInstance("myRegion1");cache.put("key","my value");
System.out.println("Value In Cache After Put [" + cache.get("key") + "]");
Thread.sleep(5000);
CompositeCacheManager.getInstance().shutDown();
cache = JCS.getInstance("myRegion1");
System.out.println("Value In Cache After Reload [" + cache.get("key") + "]");下面是我在输出中得到的结果:
Value In Cache After Put [my value]
Value In Cache After Reload [null]有人能在这个问题上给我指出正确的方向吗?我不确定这是我的配置中的问题,还是需要在代码中做些什么来告诉它从磁盘刷新。
发布于 2019-10-03 06:09:46
我知道这个问题已经过时了,原帖已经找到了替代方案,但不管怎样,这些都是我在经历了同样的问题后的发现。
CompositeCacheManager.getInstance()
CompositeCacheManager被保存为单例。此实例不准备在关机后“重新武装”,因为有一些对象仅在其构造函数中加载。并且单例实例永远不会被清除或重新分配。
在关闭之后,CompositeCacheManager实例仍然能够创建缓存对象,但是它们不是完全可操作的:它们在某种程度上是工作的,使用基本的基于内存的缓存,但是所有的辅助资源(比如FileSystem存储)再也不会被创建了。
对我来说,它看起来像是一个被破坏的实现,但我不确定这种行为是设计出来的,还是错误的结果。
解决方法
如果您处于需要取消部署/部署缓存的场景中,则必须跳过getInstance()方法并管理您自己的CompositeCacheManager实例。
由于受保护的构造函数+受保护的initialize()方法,无法直接实例化它。创建一个子类以公开这些元素,并创建一个工厂方法,该方法模仿CompositeCacheManager.getInstance()行为,但没有保留永久单一引用的部分。
发布于 2016-03-10 17:23:38
我不知道您的架构,但我没有在JCS上调用shutdown,因为我确保在关闭JCS时不会调用JCS。默认情况下,它也会从磁盘加载,所以你不需要在那里做任何事情。
https://stackoverflow.com/questions/28720584
复制相似问题