我的应用程序使用Spring 4.3. x、EhCache 3.6和javax Cache 1.1.0。以下是我在应用程序中配置javax CacheManager的方式:
<bean id="jCacheManager" class="org.springframework.cache.jcache.JCacheCacheManager">
<property name="cacheManager" ref="appCacheManagerFactoryBean" />
</bean>
<bean id="appCacheManagerFactoryBean" class="com.example.AppCacheManagerFactoryBean"/>
AppCacheManagerFactoryBean(只是JCacheManagerFactoryBean的自定义版本)帮助我为我的应用程序配置全局持久性目录。这是它的外观:
public class AppCacheManagerFactoryBean implements FactoryBean<CacheManager>, InitializingBean,
DisposableBean {
@Value("${cache.persistenceDir}")
private String persistenceDir;
private CacheManager cacheManager;
@Override
public void afterPropertiesSet() {
this.cacheManager = buildCacheManager();
}
private CacheManager buildCacheManager()
{
EhcacheCachingProvider cachingProvider = (EhcacheCachingProvider) Caching.getCachingProvider();
DefaultConfiguration defaultConfiguration = new DefaultConfiguration(cachingProvider.getDefaultClassLoader(),
new DefaultPersistenceConfiguration(new File(persistenceDir)));
return cachingProvider.getCacheManager(cachingProvider.getDefaultURI(), defaultConfiguration);
}
@Override
public CacheManager getObject() {
return this.cacheManager;
}
@Override
public Class<?> getObjectType() {
return (this.cacheManager != null ? this.cacheManager.getClass() : CacheManager.class);
}
@Override
public boolean isSingleton() {
return true;
}
@Override
public void destroy() {
this.cacheManager.close();
}
}
这是我如何定义缓存的。我使用Ehcache API来创建我的缓存,因为我的缓存需要的一些功能无法通过JCache API获得。
EhcacheManager ehcacheManager = jCacheCacheManager.getCacheManager().unwrap(EhcacheManager.class);
ehcacheManager.createCache("foo", CacheConfigurationBuilder.newCacheConfigurationBuilder(
String.class, Foo.class,
ResourcePoolsBuilder.newResourcePoolsBuilder()
.heap(1)
.offheap(1, MemoryUnit.GB)
.disk(5, MemoryUnit.GB)
));
当我尝试从应用程序中其他地方的CacheManager检索缓存时,会引发空指针异常。
Caching.getCachingProvider().getCacheManager().getCache("foo");
但是,如果我在调用CacheManager中的getCacheNames()方法后检索缓存,则会正常提取缓存。
Caching.getCachingProvider().getCacheManager().getCacheNames();
Caching.getCachingProvider().getCacheManager().getCache("foo");
我错过了什么?请帮帮我。
我的第一个问题是:“为什么不使用Spring缓存的内置支持?”它不需要这样做。JCacheCacheManager将处理一切。
然后,您的问题是缓存直接在Ehcache中创建,而不经过JSR107层。调用getCacheNames()会刷新JSR107中的缓存列表,使其正常工作。然而,我不确定这种全球性行为是有意的。但这就是它的工作方式。
解决方案是通过JSR107层按预期创建缓存。看起来像这样
CacheManager cacheManager = jcacheCacheManager.getCacheManager();
cacheManager.createCache("foo",
Eh107Configuration.fromEhcacheCacheConfiguration(
CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, Foo.class, ResourcePoolsBuilder.newResourcePoolsBuilder()
.heap(1)
.offheap(1, MemoryUnit.GB)
.disk(5, MemoryUnit.GB))
.build()));
Shiro 有三个重要的缓存接口: CacheManager - 负责所有缓存的主要管理组件,它返回 Cache 实例。 Cache - 维护key/value 对。 CacheManagerAware - 通过想要接收和使用 CacheManager 实例的组件来实现。 CacheManager 返回Cache 实例,各种不同的 Shiro 组件使用这些Cache 实例来缓存必要的数据。任何实现
CacheManager is an open source caching abstraction layer for .NET written in C#. It supports various cache providers and implements many advanced features. The main goal of the CacheManager package is
问题内容: 我正在用Java编写命令行程序的终端包装,然后使用ProcessBuilder生成子进程。将击键发送到子,我只是写从GUI直奔 给出。为了从子流程接收输出,我基本上有一个while循环,它从子流程的中读取: 这工作, 只有 当我立刻冲在输出 都 结束。也就是说,我必须刷新每个用户输入,并且子进程必须刷新自己的输入才能发生操作。否则,将等待从未真正发送的等待数据的块(子进程的stdout
我目前正在学习咖啡因,总体来说我对Spring还不熟悉。我一直在尝试用咖啡因实现缓存;然而,我发现自己遇到了几个问题。 我看到了两种配置咖啡因缓存的方法。 首先是Java类: 第二是在应用范围内。财产: 我想问一下,这两者之间有什么不同之处吗?我需要课程和应用程序吗。属性配置,还是仅其中一个?此外,在Java类实现中,cacheManager是仅应用于名为“example”的缓存,还是应用于每个缓
我有几个WAR项目,其中包括对某个实用程序JAR项目的依赖。我希望能够通过使用Spring的@Cacheable注释从实用程序项目中缓存某些方法,所以我尝试在实用程序项目上创建一个配置文件,在那里我可以定义一个CacheManager bean来处理方法的缓存。配置文件如下所示: (请注意,我使用的是Redis缓存实现,但Spring配置应该与其他缓存提供程序非常相似) 我很确定配置本身不是问题,
问题内容: 我没有找到CacheManager bean …但是我没有尝试使用CacheManager做任何事情! 这是我的错误! 这是我的POM.xml,可能是导致此问题的原因。 问题答案: 在上下文文件中,如果使用,IntelliJ会自动导入名称空间而不是名称空间!因此,当我为事务管理器添加标签时,就以为是cacheManager。