我正在使用 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);
答案1
问题解决了。事实证明,如果使用堆,存储的对象就不是不可变的。所以发生的事情是,程序从缓存中抓取一个对象,在用完后清除它的一些字段,然后当它稍后抓取该对象时,这些字段仍然被清除。