spring boot 集成 ehCache

说明

       今天在做统计报表的时候,考虑到数据比较多,所以在项目中集成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,否则缓存不生效。如下

spring boot 集成 ehCache_第1张图片

 

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> list=new ArrayList<>();
		if(StringUtils.isBlank(startDate) || StringUtils.isBlank(endDate)) {
			ResponseUtil.setResult(rsdto, null, ErrorCodeEnum.PARAMERROR, false);
			return rsdto;
		}
		/*if(StringUtils.isBlank(docTemplateCode)) {
			ResponseUtil.setResult(rsdto, null, ErrorCodeEnum.PARAMERROR, false);
			return rsdto;
		}*/
		if(StringUtils.isBlank(type)) {
			ResponseUtil.setResult(rsdto, null, ErrorCodeEnum.PARAMERROR, false);
			return rsdto;
		}
		Integer length=0;
		try {
		    length= ReportTypeEnum.getEnum(type).getValue();
		    list=docRecordTunnel.selectReportByDateTime(startDate, endDate, docTemplateCode, length);
			ResponseUtil.setResult(rsdto, list, ErrorCodeEnum.SUCCESS,true);
		} catch (Exception e) {
			log.error("DocRecordController.selectReport查询失败", e);
			ResponseUtil.setResult(rsdto, null, ErrorCodeEnum.ERROR, false);
		}
		return rsdto;
	}

 

注: 返回的实体类需要做序列化,否则查询缓存的时候会报错。如下图

spring boot 集成 ehCache_第2张图片

 

一般情况下,我们在Sercive层进行对缓存的操作。先介绍 Ehcache 在 Spring 中的注解:
* @Cacheable : Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。
* @CacheEvict : 清除缓存。 
* @CachePut : @CachePut也可以声明一个方法支持缓存功能。使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。 

简单来说,Cacheable 一般用于查询,CacheEvict 用于新增清除缓存,CachePut 用于更新;其中,value 指的是 ehcache.xml 中的缓存策略空间;key 指的是缓存的标识,同时可以用 # 来引用参数。上面代码引用参数为多个组合作为缓存key 。

5、启动项目,测试结果。具体代码我就不再贴了。

 

 

转载于:https://my.oschina.net/u/3647421/blog/3066459

你可能感兴趣的:(spring boot 集成 ehCache)