0

长话短说,我创建了一个使用 Apache JCS 来管理自己的对象的库。使用

CompositeCacheManager ccm CompositeCacheManager.getUnconfiguredInstance();
Properties props = new Properties();
props.load(fis);

ccm.configure(props);

CompositeCache<Serializable, Serializable> cache = ccm.getCache(CACHE_NAME);

上面,它从文件中读取配置并加载到缓存管理器,并且在使用测试应用程序测试库时一切正常。

但是在我的实际应用程序中,我也使用 JCS 来管理与应用程序相关的对象,这就是问题所在。

当应用程序启动时,它首先实例化应用程序缓存管理器,并成功加载所有配置并准确创建我想要的。

但是对于库的缓存管理器,它根本不使用我的配置,并且听起来它实例化了一些默认的缓存实例。例如,在我的图书馆配置中,我有:

jcs.region.MYREGION=DCACHE
jcs.region.MYREGION.cacheattributes=org.apache.commons.jcs.engine.CompositeCacheAttributes
jcs.region.MYREGION.cacheattributes.MaxObjects=1200
jcs.region.MYREGION.cacheattributes.MemoryCacheName=org.apache.commons.jcs.engine.memory.lru.LRUMemoryCache
jcs.region.MYREGION.cacheattributes.DiskUsagePattern=UPDATE

DCHACHE 辅助定义为:

jcs.auxiliary.DCACHE=org.apache.commons.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory
jcs.auxiliary.DCACHE.attributes=org.apache.commons.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes
jcs.auxiliary.DCACHE.attributes.DiskPath=LIB_DATA_DIR
jcs.auxiliary.DCACHE.attributes.MaxPurgatorySize=10000
jcs.auxiliary.DCACHE.attributes.MaxKeySize=10000
jcs.auxiliary.DCACHE.attributes.OptimizeAtRemoveCount=300000
jcs.auxiliary.DCACHE.attributes.MaxRecycleBinSize=7500

表明它没有使用相关配置的证据是:它使用 SWAP 创建了 MYREGION 的 DiskUsagePattern(我也尝试了 DiskUsagePatternName 但没有任何区别)。

它不使用 LIB_DATA_DIR 作为 DisckPath。而是使用我已经为应用程序的配置定义的那个。

如果我评论应用程序的 JCS 相关代码,它适用于库的 JCS。

我也试过 JCS.getInstance("cache_name") 但它没有区别。

你们有什么想法吗?

4

1 回答 1

0

经过几个小时的深入研究,发现 JCS 很难处理单独的配置文件。听起来 JCS 只能使用每个 java 虚拟机的配置文件配置一次。

所以我最终使用一个文件来配置 JCS。这样,如果应用程序首先实例化 JCS,它也会加载库的配置,然后在库中一切正常。

于 2016-07-25T15:48:46.880 回答