今天想给之前练手的项目加一个缓存,但是控制台报错 : Cannot find cache named … 于是在网上搜索解决方案,可惜没看到比较完整的解决方案 以下是自己手动试错得出的正确解决方案
首先在启动类上加上 @EnableCaching
注解,在希望缓存其结果的方法上加上 @Cacheable
注解,e.g. @Cacheable(value = "test", key = "#killId")
其中value是缓存名称,key是缓存的键,这里都知道,不赘述。
@Cacheable(value = "test", key = "#killId")
public ItemKill getIKilltem(Integer killId){
ItemKill itemKill=itemKillMapper.selectByIdV2(killId);
return itemKill;
}
浏览器中访问该路径报错 :
java.lang.IllegalArgumentException: Cannot find cache named 'test' for Builder ... ...
在网上一通搜索 首先考虑是不是没没导入相关jar包 于是导入 spring-boot-starter-cache
结果没任何作用 因为SpringBoot是自带simple缓存管理器的,使用simple缓存管理器不需要导入额外的jar包
网上的说法是没有在SpringBoot配置文件中配置该缓存名称(既上面的test) 于是在配置文件中配置了
spring.cache.cache-names=test
结果直接连项目的主页面也无法访问了,报错信息更多了 显然是配置的有问题啊
配置文件中显示这一配置项的值是字符串列表类型的 (List<String>) 难道要加一个逗号来显示这是列表?
spring.cache.cache-names=test ,
当然还是没任何作用 ,因为伟大的SpringBoot怎么可能这么不智能
其实这是配置文件中的缓存部分没写完整,在这之前加上一句就可以了:
spring.cache.type=simple // 指定所使用的缓存管理器
spring.cache.cache-names=test
虽然simple是SpringBoot是默认缓存管理器,但是如果对缓存进行配置的话这句是不能丢的,加上这句之后 项目顺利用上了缓存
首次访问,控制台打印日志:
2020-12-04 17:54:50.451 DEBUG 14176 --- [apr-8080-exec-5] o.s.b.w.f.OrderedRequestContextFilter : Bound request context to thread: org.apache.catalina.connector.RequestFacade@31ffc12f
2020-12-04 17:54:50.455 DEBUG 14176 --- [apr-8080-exec-5] c.d.k.m.m.ItemKillMapper.selectByIdV2 : ==> Preparing: SELECT a.*, b.name AS itemName, (CASE WHEN (now() BETWEEN a.start_time AND a.end_time) THEN 1 ELSE 0 END) AS canKill FROM item_kill AS a LEFT JOIN item AS b ON b.id = a.item_id WHERE a.is_active = 1 AND a.id =? AND a.total>0
2020-12-04 17:54:50.457 DEBUG 14176 --- [apr-8080-exec-5] c.d.k.m.m.ItemKillMapper.selectByIdV2 : ==> Parameters: 1(Integer)
2020-12-04 17:54:50.462 DEBUG 14176 --- [apr-8080-exec-5] c.d.k.m.m.ItemKillMapper.selectByIdV2 : <== Total: 1
2020-12-04 17:54:50.468 DEBUG 14176 --- [apr-8080-exec-5] o.s.b.w.f.OrderedRequestContextFilter : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@31ffc12f
显然执行了 sql 语句
再次访问,控制台打印:
2020-12-04 17:55:32.991 DEBUG 14176 --- [apr-8080-exec-9] o.s.b.w.f.OrderedRequestContextFilter : Bound request context to thread: org.apache.catalina.connector.RequestFacade@2dd40137
2020-12-04 17:55:32.995 DEBUG 14176 --- [apr-8080-exec-9] o.s.b.w.f.OrderedRequestContextFilter : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@2dd40137
没执行sql 直接走的缓存 显然缓存起作用了
总结就一句话 在配置文件中配置缓存管理器和缓存名称 (缓存管理器也要配置 只配置缓存名称会报错)