关闭后JCS 1.3刷新磁盘缓存

时间:2015-02-25 13:44:02

标签: java caching jcs

我正在尝试使用JCS 1.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]

有人能指出我在这个方向的正确方向吗?不确定我的配置是否存在问题,或者需要在代码中执行某些操作以告知它从磁盘刷新。

2 个答案:

答案 0 :(得分:0)

我知道问题很旧,原始发帖人已经找到了替代方法,但是无论如何,这是我在遇到相同问题后的发现。

CompositeCacheManager.getInstance()

CompositeCacheManager保持为单例。关闭后,该实例不准备“撤防”,因为有些对象仅在其构造函数中加载。而且单例实例永远不会清除或重新分配。

关闭后,CompositeCacheManager实例仍然可以创建缓存对象,但是它们不能完全正常运行:它们可以使用基于内存的基本缓存进行工作,但是可以使用所有辅助资源(例如FileSystem存储) ),再也不会创建。

对我来说,这看起来像是一个坏了的实现,但是我不确定是设计使然还是错误导致了这种行为。

解决方法

如果您处于需要取消部署/部署缓存的情况,则必须跳过getInstance()方法并管理自己的CompositeCacheManager实例。

由于受保护的构造函数+受保护的initialize()方法,因此无法直接实例化它。创建一个子类以暴露那些元素,并创建一个模仿CompositeCacheManager.getInstance()行为的工厂方法,但没有保留永恒单一引用的部分。

答案 1 :(得分:-1)

关机调用将处理缓存。我不知道你的架构,但我没有在JCS上调用shutdown,因为我确保在关闭它时没有对JCS进行调用。这使它写入磁盘。默认情况下,它也将从磁盘加载,因此您无需在那里执行任何操作。