今天想给之前练手的项目加一个缓存,但是控制台报错 : 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 直接走的缓存 显然缓存起作用了

总结就一句话 在配置文件中配置缓存管理器和缓存名称 (缓存管理器也要配置 只配置缓存名称会报错)

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐