我们有一个工具可以处理来自两个不同复杂来源的对象。这些源的内部结构和它们所拥有的对象是相似的。可以通过短字符串来标识源,例如A和B.
我们使用Ehcache缓存对象。来自不同来源的对象需要分开。由于两个源的复杂性和相似性,这种分离是通过使用具有不同缓存路径的两个不同CacheManagers来完成的。我们期望源A的对象存储在例如[base folder]/cache.A
中,而源B中的对象存储在[base folder]/cache.B
中。
我们使用公共ehcache.xml
文件设置缓存管理器,该文件由其URL引用。然后,每个缓存管理器由sourceId引用。
URL ehcacheXML = getClass().getResource("/ehcache.xml");
Configuration config = ConfigurationFactory.parseConfiguration(ehcacheXML);
DiskStoreConfiguration diskConfig = config.getDiskStoreConfiguration();
diskConfig.setPath([base folder] + "/cache." + sourceId);
CacheManager manager = CacheManager.create(config);
问题是只创建了一个文件夹,例如cache.A
。任何访问都会进入此文件夹,无论是通过缓存管理器为A保存的缓存还是通过B的缓存,都无法进行访问。
例如,假设我想为两个源访问objectName
的缓存对象。对于每个源,它们存储在名为cacheName
的缓存中。然后cacheManagerA.getCache(cacheName).get(objectName)
访问与cacheManagerB.getCache(cacheName).get(objectName)
相同的元素。令人惊讶的是,cacheManagerA.getCache(cacheName).getGuid()
和cacheManagerB.getCache(cacheName).getGuid()
不同,cacheManagerA
和cacheManagerB
也不同(具有不同的哈希码)。
我尝试使用newInstance()
而不是create()
创建缓存管理器,但这并没有解决问题。
答案 0 :(得分:0)
找到解决方案:需要进行两项更改:
config.setName(sourceId)
newInstance(config)
代替create(config)
如果没有第一点,调用newInstance()
将始终返回相同的实例,类似于create()
。