在 Spring 中设置和使用 ehcache 后缓存为空
Cache is empty after setting up and using ehcache in Spring
我的代码在下面,当我走到最后并尝试从缓存中打印出一些东西时,键列表是空的。
@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 方法 public 。我不明白为什么会忽略对注释为 @Cacheable 的方法的调用。
这两个链接强化了 John R 给出的答案
Stack Overflow similar question
java2practice article
我不确定错误消息,但您在私有方法上有 @Cacheable
。由于您是从同一个 class 中进行调用,因此不会被 Spring 拦截,因此不会发生缓存。
Spring 通常的工作方式是 creating proxies 每个 @Service
(或 @Component
、@Controller
等)。当某些东西调用该服务时,它实际上会访问代理。代理查看实际目标上的注释(例如 @Cacheable
或 @Transactional
),然后执行一些操作 before/after 调用实际目标方法。
我刚才描述的方式有点简化,还有其他方式 Spring 可以 proxy your class。在接口未指定代理方法的情况下,Spring 可以动态生成目标 class(您的服务)的子class。还有编译时间和加载时间编织,其中用于实现注释的字节码被注入到编译的 class 文件中。
如果您之前 运行 没有了解过这个,我强烈建议您阅读 Spring 文档中关于 AOP 的部分。
我的代码在下面,当我走到最后并尝试从缓存中打印出一些东西时,键列表是空的。
@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 方法 public 。我不明白为什么会忽略对注释为 @Cacheable 的方法的调用。
这两个链接强化了 John R 给出的答案 Stack Overflow similar question java2practice article
我不确定错误消息,但您在私有方法上有 @Cacheable
。由于您是从同一个 class 中进行调用,因此不会被 Spring 拦截,因此不会发生缓存。
Spring 通常的工作方式是 creating proxies 每个 @Service
(或 @Component
、@Controller
等)。当某些东西调用该服务时,它实际上会访问代理。代理查看实际目标上的注释(例如 @Cacheable
或 @Transactional
),然后执行一些操作 before/after 调用实际目标方法。
我刚才描述的方式有点简化,还有其他方式 Spring 可以 proxy your class。在接口未指定代理方法的情况下,Spring 可以动态生成目标 class(您的服务)的子class。还有编译时间和加载时间编织,其中用于实现注释的字节码被注入到编译的 class 文件中。
如果您之前 运行 没有了解过这个,我强烈建议您阅读 Spring 文档中关于 AOP 的部分。