在Spring中设置并使用ehcache后,缓存为空



我的代码如下,当我到达末尾并试图从缓存中打印出一些东西时,键列表是空的。

@Configuration
@EnableCaching
public class EhcacheConfiguration implements CachingConfigurer
{
    CacheConfiguration cacheConfiguration = new CacheConfiguration();
    cacheConfiguration.setName("DataCache");
    cacheConfiguration.setMemoryStoreEvictionPolicy("LRU");
    cacheConfiguration.setMaxEntiresLocalHeap(1000);
    cacheConfiguration.setEternal(false);
    net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration();
    config.addCache(cacheConfiguration);
    return net.sf.ehcache.CacheManager.newInstance(config);
} 
@Bean
@Override
public CacheManager cacheManager()
{
    return new EhCacheManager(ehCacheManager());
}
@Override
public CacheResolver cacheResolver()
{
    return new SimpleCacheResolver();
}
@Bean
@Override
public KeyGenerator keyGenerator()
{
    return new SimpleKeyGenerator();
}
@Override public CacheErrorHandler errorHandler()
{
    return new SimpleCacheErrorHandler();
}
@Service
public class DataCalculationsDataServiceImp implements DataSubcalculationsDataService
{
    .
    .
    .
@Cacheable("DataCache")
public ThreadSafeList<float[]> createCacheableDataList()
{
    return new ThreadSafeList<float[]>();
}
@Override
public void readData(DataCalculationEtity dataCalculationEntity, InputStream inputStream)
{
    .
    .
    .
    ThreadSafeList<float[]> dataList = createCacheableDataList();
    .
    .
    (dataList is eventually assigned data)
    .
    .
    EhCacheCacheManager manager = new (EhCacheCacheManager)applicationContext.getBean("cacheManager");
    Cache dataListCache = cacheManager.getCache("DataCache");
    net.sf.ehcache.Ehcache ehCache = (net.sf.ehcache.Ehcache) dataListCache.getNativeCache();
    LOG.info("Size of dataListCache: " + ehCache.getSize());
}

打印出来的尺寸是零,我不知道为什么。我做了一些更新,比如按照一个答案中的建议公开我的@Cacheable方法。我不明白为什么对注释为@Cacheable的方法的调用会被忽略。

这两个环节强化了John R给出的答案堆栈溢出类似问题java2实践文章

我不确定错误消息,但您有一个私有方法上的@Cacheable。由于您是从同一个类中进行调用的,因此它不会被Spring拦截,因此缓存不会发生。

Spring通常的工作方式是为每个@Service(或@Component@Controller等)创建代理。当某个东西调用该服务时,它实际上击中了代理。代理查看实际目标上的注释(例如,@Cacheable@Transactional),然后在调用实际目标方法之前/之后执行一些操作。

我刚才描述它的方式有点简化,Spring还可以通过其他方式代理您的类。在接口未指定代理方法的情况下,Spring可以动态生成目标类(您的服务)的子类。还有编译时和加载时交织,用于实现注释的字节码被注入到编译后的类文件中。

如果您以前没有遇到过这种情况,我强烈建议您阅读Spring文档中关于AOP的部分。

最新更新