我正在使用 ehcache (3.8.0) 和 Java (1.8.0_222) 将值存储在从 SQL 数据库检索的堆上。我遇到的问题是存储的值是对象列表,并且这些对象还包含列表,并且随着时间的推移,这些最内层列表中的引用似乎变为空。我已经尝试在一个较小的程序中重新创建它但没有成功,所以我猜这是我忽略的愚蠢而不是 ehcache 的问题。
我用于设置缓存的代码是
final long cacheSize = 1L;
final MemoryUnit cacheUnits = MemoryUnit.GB;
ResourcePoolsBuilder resourcePools = ResourcePoolsBuilder
.newResourcePoolsBuilder()
.heap(cacheSize, cacheUnits);
CacheConfigurationBuilder<Key, List<MyInterface>> cacheConfigurationBuilder = CacheConfigurationBuilder
.newCacheConfigurationBuilder(Key.class, (Class<List<MyInterface>>)(Class<?>)List.class, resourcePools)
.withSizeOfMaxObjectGraph(Long.MAX_VALUE);
cacheManager = CacheManagerBuilder
.newCacheManagerBuilder()
.withCache(cachesName, cacheConfigurationBuilder)
.build();
cacheManager.init();
cache = cacheManager.createCache(cacheName, cacheConfigurationBuilder);
解决了问题。事实证明,如果您使用堆存储的对象不是不可变的。所以发生的事情是程序从缓存中抓取一个对象,当它完成时清除它的一些字段,然后当它后来抓取对象时,这些字段仍然被清除。