【发布时间】: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() 不同,cacheManagerA 和 cacheManagerB 也不同(具有不同的哈希码)。
我尝试使用 newInstance() 而不是 create() 创建缓存管理器,但这并没有解决问题。
【问题讨论】:
-
需要 Ehcache 版本才能给出准确的答案。但正如其 javadoc 所述,
CacheManager.create将在您想要一个单例CacheManager时使用。