我正在使用Spring启动(1.4.2.RELEASE)和Ehcache(2.4.3)
缓存正在开发环境中使用,但在其他环境中没有被使用(命中)(测试和产品)。
代码如下:
的pom.xml
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
在主类上,添加了以下缓存注释
@EnableCaching
public class Application {
在 src / main / resources下,ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd"
updateCheck="true" monitoring="autodetect" dynamicConfig="true">
<cache name="languageCache"
maxEntriesLocalHeap="20"
overflowToDisk="false"
eternal="false"
diskPersistent="false"
memoryStoreEvictionPolicy="LRU"/>
<cache name="countryCache"
maxEntriesLocalHeap="280"
overflowToDisk="false"
eternal="false"
diskPersistent="false"
memoryStoreEvictionPolicy="LRU"/>
..
..
more entries
</ehcache>
缓存配置文件
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager getEhCacheManager() {
(new EhCacheCacheManager(getEhCacheFactory().getObject())).getCache("languageCache");
return new EhCacheCacheManager(getEhCacheFactory().getObject());
}
@Bean
public EhCacheManagerFactoryBean getEhCacheFactory() {
EhCacheManagerFactoryBean factoryBean = new EhCacheManagerFactoryBean();
factoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
factoryBean.setShared(true);
return factoryBean;
}
}
关于上述代码的几个问题:
1)是否由于此行
factoryBean.setConfigLocation(new ClassPathResource(“ehcache.xml”));
除Dev env以外的任何其他环境中都没有命中/使用缓存?
2)我们是否需要CacheConfig文件?或Spring启动会在Main Class上使用注释(@EnableCaching)来检测Ehcache吗?
任何建议,为什么在其他环境中没有获取缓存(我缺少一些配置?)?
谢谢
答案 0 :(得分:1)
除非你的类路径中有很多ehcache.xml
,否则它应该可行。除非你的类路径中有一个符合JSR107的实现(例如Ehcache 3),否则@EnableCaching
不会通过魔法工作。
您的代码有效。唯一奇怪的部分是你自己打电话给getObject()
。它仍然有效,但我会做到的。
@Bean
public CacheManager cacheManager(net.sf.ehcache.CacheManager cacheManager) {
return new EhCacheCacheManager(cacheManager);
}
@Bean
public EhCacheManagerFactoryBean cacheManagerFactory() {
EhCacheManagerFactoryBean factoryBean = new EhCacheManagerFactoryBean();
factoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
factoryBean.setShared(true);
return factoryBean;
}
那就是说,事实上我会做一些更简单的事情:
@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
@Bean
@Override
public CacheManager cacheManager() {
return new EhCacheCacheManager(new net.sf.ehcache.CacheManager());
}
}
另外,请注意,您确实需要共享缓存管理器真的非常罕见。它已经在应用程序上下文中共享。因此,将它作为单身人士分享是非常罕见的(而且经常是危险的)。