![ehcache 中存储为值的对象中的引用正在消失](https://linux22.com/image/1606614/ehcache%20%E4%B8%AD%E5%AD%98%E5%82%A8%E4%B8%BA%E5%80%BC%E7%9A%84%E5%AF%B9%E8%B1%A1%E4%B8%AD%E7%9A%84%E5%BC%95%E7%94%A8%E6%AD%A3%E5%9C%A8%E6%B6%88%E5%A4%B1.png)
我正在使用 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
问题解决了。事实证明,如果使用堆,存储的对象就不是不可变的。所以发生的事情是,程序从缓存中抓取一个对象,在用完后清除它的一些字段,然后当它稍后抓取该对象时,这些字段仍然被清除。