Ehcache:两个不同的CacheManagers配置为使用不同的文件夹但实际上使用相同的文件夹

时间:2016-12-07 14:19:16

标签: java ehcache

我们有一个工具可以处理来自两个不同复杂来源的对象。这些源的内部结构和它们所拥有的对象是相似的。可以通过短字符串来标识源,例如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()不同,cacheManagerAcacheManagerB也不同(具有不同的哈希码)。

我尝试使用newInstance()而不是create()创建缓存管理器,但这并没有解决问题。

1 个答案:

答案 0 :(得分:0)

找到解决方案:需要进行两项更改:

  • 为每个实例指定一个新名称,例如config.setName(sourceId)
  • 使用newInstance(config)代替create(config)

如果没有第一点,调用newInstance()将始终返回相同的实例,类似于create()