【问题标题】:Ehcache: two different CacheManagers configured to use different folders but actually use the sameEhcache:配置为使用不同文件夹但实际上使用相同的两个不同 CacheManager
【发布时间】:2016-12-07 14:19:16
【问题描述】:

我们有一个工具可以处理来自两个不同的复杂来源的对象。这些来源的内部结构和它们所持有的对象是相似的。来源可以通过一个短字符串来识别,比如 A 和 B。

我们使用 Ehcache 缓存对象。来自不同来源的对象需要分开保存。由于两个来源的复杂性和相似性,这种分离是通过使用具有不同缓存路径的两个不同的 CacheManager 来完成的。我们的期望是源 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() 创建缓存管理器,但这并没有解决问题。

【问题讨论】:

  • 需要 Ehcache 版本才能给出准确的答案。但正如其 javadoc 所述,CacheManager.create 将在您想要一个单例 CacheManager 时使用。

标签: java ehcache


【解决方案1】:

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

  • 为每个实例分配一个新名称,例如config.setName(sourceId)
  • 使用newInstance(config) 而不是create(config)

没有第一点,调用newInstance()总是会返回同一个实例,类似于create()

【讨论】:

    猜你喜欢
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 2014-09-22
    相关资源
    最近更新 更多