我尝试了几种方法在Spring Boot应用程序上实现缓存,这似乎是正确的方法,但它只是记录
CacheStatistics,CacheManager=urn.X-ehcache.jsr107-default-config,Cache=studentCache
Registering Ehcache MBean javax.cache:type=CacheStatistics,CacheManager=urn.X-ehcache.jsr107-default-config,Cache=studentCache
我有一个事件记录器,但我没有看到它的任何输出:
@Component
public class EventLogger implements CacheEventListener<Object, Object> {
private static final Logger LOGGER = LoggerFactory.getLogger(EventLogger.class);
@Override
public void onEvent(CacheEvent<?, ?> event) {
LOGGER.info("Event: " + event.getType() + " Key: " + event.getKey() + " old value: " + event.getOldValue() + " new value: " + event.getNewValue());
}
}
缓存配置
@Configuration
public class CacheConfig {
@Bean
public JCacheManagerCustomizer cacheManagerCustomizer() {
return new JCacheManagerCustomizer() {
@Override
public void customize(CacheManager cacheManager) {
cacheManager.createCache("studentCache", new MutableConfiguration<>()
.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.MINUTES, 5)))
.setStoreByValue(false)
.setStatisticsEnabled(true));
}
};
}
}
缓存打开方法
@RequestMapping(method = GET)
@ResponseBody
Cacheable(value = "studetNode")
public List<StudentNodeDto> findAll(HttpServletResponse response) {
val studentNodes = service.findAll();
ehcache.xml位于资源下
<config
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns='http://www.ehcache.org/v3'
xmlns:jsr107='http://www.ehcache.org/v3/jsr107'>
<service>
<jsr107:defaults>
<jsr107:cache name="studentCache" template="heap-cache"/>
</jsr107:defaults>
</service>
<cache-template name="heap-cache">
<listeners>
<listener>
<class>org.terracotta.ehcache.EventLogger</class>
<event-firing-mode>ASYNCHRONOUS</event-firing-mode>
<event-ordering-mode>UNORDERED</event-ordering-mode>
<events-to-fire-on>CREATED</events-to-fire-on>
<events-to-fire-on>UPDATED</events-to-fire-on>
<events-to-fire-on>EXPIRED</events-to-fire-on>
<events-to-fire-on>REMOVED</events-to-fire-on>
<events-to-fire-on>EVICTED</events-to-fire-on>
</listener>
</listeners>
<resources>
<heap unit="entries">2000</heap>
<offheap unit="MB">100</offheap>
</resources>
</cache-template>
</config>
grad le dependencies < code > spring boot version = ' 2 . 0 . 2 . release '
compile group: 'org.springframework.boot', name: 'spring-boot-starter', version: springBootVersion
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springBootVersion
//Cache
compile group: 'org.springframework.boot', name: 'spring-boot-starter-cache', version: '2.1.1.RELEASE'
compile group: 'org.ehcache', name: 'ehcache', version: '3.4.0'
compile group: 'javax.cache', name: 'cache-api', version: '1.1.0'
我看了很多帖子和博客,似乎我做的是正确的,但我一定有什么地方错了。
@Cacheable多个方法参数的键
https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#cache
https://www.baeldung.com/spring-cache-tutorial
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-caching.html
https://www.baeldung.com/hibernate-second-level-cache
https://medium.com/@igorkosandyak/spring-boot-caching-d74591abe117
建议?
---------------更新1-----------------
我得到一个错误说:
Error creating bean with name 'cacheManager' defined in class path
resource
[org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.class]: Unsatisfied dependency expressed through method 'cacheManager' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jCacheCacheManager' defined in class path resource [org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.cache.CacheManager]: Factory method 'jCacheCacheManager' threw exception; nested exception is org.ehcache.jsr107.MultiCacheException: [Exception 0] org.terracotta.ehcache.EventLogger
当我添加时,我得到了这个:
# caching
spring.cache.jcache.provider=org.ehcache.jsr107.EhcacheCachingProvider
spring.cache.jcache.config=classpath:ehcache.xml
跟踪
restartedMain] heConfiguration$JCacheAvailableCondition : Condition JCacheCacheConfiguration.JCacheAvailableCondition on org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration matched due to AnyNestedCondition 1 matched 1 did not; NestedCondition on JCacheCacheConfiguration.JCacheAvailableCondition.CustomJCacheCacheManager @ConditionalOnSingleCandidate (types: javax.cache.CacheManager; SearchStrategy: all) did not find any beans; NestedCondition on JCacheCacheConfiguration.JCacheAvailableCondition.JCacheProvider JCache JCache provider specified
--------------更新2------------------
task showJarLocations {
doLast {
configurations.compile.resolve().each { file ->
println file.canonicalPath
}
}
}
使用ehcache显示的唯一jar是:
/org.ehcache/ehcache/3.4.0/cac1f0840af0040a81401dfa55fa31a4ccc17932/ehcache-3.4.0.jar
and
javax.cache/cache-api/1.1.0/77bdcff7814076dfa61611b0db88487c515150b6/cache-api-1.1.0.jar
我有
spring.cache.jcache.provider=org.ehcache.jsr107.EhcacheCachingProvider
spring.cache.jcache.config=classpath:ehcache.xml
在application.properties
中也是如此。这应该可以解释为什么当我添加spring.cache.jcache.config=classpath:ehcache.xml.
时它会失败
但是,在我的项目结构中:
+--- org.springframework.boot:spring-boot-starter-cache:2.1.1.RELEASE
| +--- org.springframework.boot:spring-boot-starter:2.1.1.RELEASE -> 2.0.2.RELEASE (*)
| \--- org.springframework:spring-context-support:5.1.3.RELEASE -> 5.0.6.RELEASE
| +--- org.springframework:spring-beans:5.0.6.RELEASE (*)
| +--- org.springframework:spring-context:5.0.6.RELEASE (*)
| \--- org.springframework:spring-core:5.0.6.RELEASE (*)
+--- org.ehcache:ehcache:3.4.0
| \--- org.slf4j:slf4j-api:1.7.7 -> 1.7.25
+--- javax.cache:cache-api:1.1.0
+--- org.apache.tika:tika-core:1.19.1
+--- org.mapstruct:mapstruct-jdk8:1.2.0.Final
+--- org.projectlombok:lombok:1.18.2
使实体或 dto 实现可序列化。在我的情况下工作。
>
@EnableCaching
确保@Cacheable
中的名称与您的缓存名称匹配(您发布的内容不匹配)
@Cacheable(value = "studentCache")
删除您的CacheConfig
将您的电子邮件放入缓存。xml文件,以确保您没有从其他jar中获取
e.g. `resources/myconfig/ehcache.xml`
在application.properties中设置属性以告诉Spring在哪里可以找到配置文件
spring.cache.jcache.config=classpath:myconfig/ehcache.xml
使用简化的ehcache.xml。例如
<config
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns='http://www.ehcache.org/v3'
xmlns:jsr107='http://www.ehcache.org/v3/jsr107'
xsi:schemaLocation="
http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd
http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd">
<cache alias="studentCache" uses-template="heap-cache" />
<cache-template name="heap-cache">
<resources>
<heap unit="entries">2000</heap>
<offheap unit="MB">100</offheap>
</resources>
</cache-template>
</config>
如果仍然失败,发布结果,显示您如何知道它失败。
使用<code>时需要CacheConfig的原因
我发现使用spring-boot-starter-cache会产生一些微妙的问题。如果找不到您的ehcache.xml或您命名错误的缓存名称,Spring似乎会回退到通用缓存实现,从而隐藏问题。尝试删除spring-boot-starter-cache作为依赖项并添加:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
另外,添加ehcache作为显式依赖项,然后看看这是否有帮助。您甚至不需要访问CacheManager,因为您正在使用ehcache。xml;xml的全部目的是使您的配置具有声明性,并且在代码之外。
问题内容: 我需要在应用程序中缓存一些数据,并且我正在考虑使用Ehcache。我有几个问题: 我是否需要其他服务器进行Ehcache? 我是否需要其他客户端来使用Ehcache? Ehcache如何与多个实例一起使用?甚至可以使用Ehcache创建类似共享缓存的内容吗? 问题答案: 我是否需要其他服务器进行Ehcache? 您可以在独立模式下使用Ehcache。在这种拓扑中,缓存数据保存在应用程序
我有一个运行Hibernate4.1.7的应用程序,并且正在使用ehcache作为2级缓存。我知道从冬眠4开始,我需要使用与冬眠捆绑在一起的ehcache罐子,但这些罐子已经很老了。 当前最新版本的ehcache是2.6.3,但hibernate 4.1.7附带的版本是2.4.3。问题是hibernate没有与EhcacheTerracotta jar捆绑在一起,我的Terracott服务器也与E
我正在使用一个keytab,并使用windows命令行上的kinit命令设置它。我得到消息“new ticket is storage in cache file”。之后,当我运行java应用程序访问keytab文件以获取密钥时,我得到以下错误。 C:\users\cxxxxx\git\abcd.keytab refreshKrb5Config为false主体为xxxx_dev@xxxx.xxxx
我使用EhCache框架来缓存应用程序数据,并考虑使用JGroups缓存复制来复制集群环境中的缓存。 它真的是集群环境中缓存复制的行业标准吗?或者,我应该考虑其他更好的选择。请注意,此时我没有使用任何集中式缓存服务器。我已经在JGroups缓存复制上做了POC。你能就它的健壮性和主要关注点分享你的经验吗?使用JGroups进行缓存复制的利弊是什么?
针对 Subversion 1.4(根据r2866编译) 前言 序言 读者 怎样阅读本书 本书约定 排版习惯 图标 本书的结构 本书是免费的 致谢 来自 Ben Collins-Sussman 来自 Brian W. Fitzpatrick 来自 C. Michael Pilato Subversion是什么? Subversion的历史 Subversion的特性 Subversion的架构 S
本文向大家介绍Android同时安装Release和Debug版本的方法,包括了Android同时安装Release和Debug版本的方法的使用技巧和注意事项,需要的朋友参考一下 一般项目做到后期,在测试的时候,需要在测试版本和正式版本之间进行频繁的切换,怎么办呢?土豪的话可以考虑使用两台机器,同时测试,然而为了方便测试,节约成本,最好的办法当然是在同一台机器上安装不同的版本。 然而,原则上来说,