说明
今天在做统计报表的时候,考虑到数据比较多,所以在项目中集成ehCache减轻数据库请求压力。看似简单,网上参考也比较多,但是还遇到了几处坑,在此记录一下。 ⊙﹏⊙b
随手笔记,比较简单,想要具体了解的可以网上看看大神的博客
问题
(1)、springboot集成了ehcache,配置了过期时间timeToIdleSeconds,发现就是不生效,问度娘后才知道需要在properties文件中指定缓存类型,不然spring boot 使用默认SimpleCacheConfiguration,不是用的ehcache。
(2)、测试的时候第一次请求接口返回正常数据,第二次查询缓存的时候会报java.io.Serializable这个错,是因为我返回的实体类没做序列化。
解决方案在下面
1、首先引入依赖在pom.xml文件中
org.springframework.boot
spring-boot-starter-cache
net.sf.ehcache
ehcache
2、引入配置文件 ehcache.xml(自己手残名字写错ehcach,导致启动报错,加载不到配置,懵逼。。。。。)
3、在properties文件中指定缓存类型和加载xml,也就是我上面说的问题 ”(1)“。xml也可以用@ImportResource注解直接在spring boot启动类配置。
spring.cache.type=ehcache
spring.cache.ehcache.config=classpath:META-INF/mybatis/ehcache.xml
4、在spring boot 启动类也要开启缓存注解@EnableCaching,否则缓存不生效。如下
5、以上集成工作已经完成,那如何在代码中使用呢? 如下
/**
* 查询请求记录数据统计
*
* @param docNos
* @return
*/
@Cacheable(key = "#startDate+'-'+#endDate+'-'+#type",value="userCache")
public ResponseMessage>> selectReport(String startDate, String endDate, String docTemplateCode,String type) {
ResponseMessage>> rsdto = new ResponseMessage<>();
List
注: 返回的实体类需要做序列化,否则查询缓存的时候会报错。如下图
一般情况下,我们在Sercive层进行对缓存的操作。先介绍 Ehcache 在 Spring 中的注解:
* @Cacheable : Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。
* @CacheEvict : 清除缓存。
* @CachePut : @CachePut也可以声明一个方法支持缓存功能。使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
简单来说,Cacheable 一般用于查询,CacheEvict 用于新增清除缓存,CachePut 用于更新;其中,value 指的是 ehcache.xml 中的缓存策略空间;key 指的是缓存的标识,同时可以用 # 来引用参数。上面代码引用参数为多个组合作为缓存key 。
5、启动项目,测试结果。具体代码我就不再贴了。