解决springboot中@ehcache不起作用的问题

一 问题描述

问题描述前,请允许我,吐槽一下,这个问题困扰了一天,下面在业务层下的代码中,@cache注解标注了value的名称,但是没有设置key,且传递的参数为

CrawlRecordParamVo crawlRecordParamVo ,是一个对象,每次调用都要查询一次数据库,没有启动缓存的作用

原因在于没有制定key,因为:对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行此方法从数据库中拿到,并将返回结果存入指定的缓存中。

二 解决办法

1.思想:将对象bean中查询的属性字段,通过md5加密生成一个字符串,作为一个唯一的主键,如在下图对象bean中定义uuid

2.将对象中作为查询条件的字段,通过md5加密:这样保证本次,以及上次的查询条件没有修改的话,这些查询条件生成的md5字符串是一样,也就是key是一样,则直接从缓存中拿到数据,否则查询条件有改动,如查询日期改了,则这些查询条件生成的md5串也就发生改变,这时候的key就是新key,就会重新查询数据库,进行返回并将结果缓存到缓存中。

3.在缓存的注解标注的方法上,设置   CrawlRecordParamVo对象中uuid主键

4.测试

通过页面调用,查询看到console显示:第一次查询了数据库,将结果存入缓存中,后面多次点击查询,走到controller后,直接从缓存中拿到数据。不再执行service层的

public Map<String,Object> exportCrawlRecordInfoList(CrawlRecordParamVo crawlRecordParamVo) 

这个方法了。

修改一下pageSize的值,再次查询

通过控制台日志看到:修改pagesize之后(12变为10),就执行了一次查询数据库,后面都是从缓存中直接取得的结果。

二 案例2

2.1 业务层

 2.2 javabean

 2.3  调试

 2.4 调试

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
【资源说明】 1、基于SpringBoot+Layui+shiro安全框架和Ehcache缓存框架搭建的学生管理系统源码+项目说明.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 4、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于SpringBoot+Layui+shiro安全框架和Ehcache缓存框架搭建的学生管理系统源码+项目说明.zip # StudentManagementSystem SpringBoot+Layui搭建的学生管理系统,加入了shiro安全框架和Ehcache缓存框架 最近新学习了前端框架Layui、安全框架Shiro、缓存框架Ehcache的基本用法,边学习边练习,写了这个学生管理系统。 ### 介绍 该系统相对于以前的练手项目,最主要就是新增了shiro权限。我在菜单栏用了shiro标签对菜单进行控制,根据登录用户的不同,显示不同的菜单和操作按钮。 新接触的Layui的表单可以说是非常实用了,但是我用ehcache缓存对list集合进行缓存时,layui的表格分页功能就会失效(比如我查询学生列表,并且对这个list添加了缓存,那么在前端展示时,layui的分页功能就会失效,转而显示所有的学生),目前还没有找到解决办法,所以在项目就没有对list查询进行缓存。 基本的环境: * Spring+SpringMVC+Mybatis * 前端:Layui+Thymeleaf模板 * 安全框架:shiro * 缓存:抽象缓存Ehcache * 简单的Restful风格开发 * pagehelper分页助手 * 加入了Druid数据监控 ### 数据库文件 数据库的文件放在了display目录下,可作为学习参考使用 ### 模块说明(大体框架是这样,不做细分) src|—— |——main |—— ├── java/com/braisedpanda |—— |——bean --:javabean |——config --:自定义的各种配置类 |——controller --:controller层 |——mapper --:mapper借口层 |——service --:service层 |——serviceimpl --:service实现层,可以和service放在一起 |——xxxxApplication --:项目的启动类 ├── resource |—— |——mybatis --:放置mybatis文件 |——static --:放置静态资源(图片、js、css之类的) |——templates --:themeleaf模板 |——application --:spring配置文件 ### 预览 #### `学生列表`<br><br> ![]
Spring Boot 基础教程(基于1.3.x-1.5.x) 快速入门 chapter1:基本项目构建(可作为工程脚手架),引入web模块,完成一个简单的RESTful API 使用Intellij的Spring Initializr来快速构建Spring Boot/Cloud工程 工程配置 chapter2-1-1:配置文件详解:自定义属性、随机数、多环境配置等 chapter2-1-2:2.0 新特性(一):配置绑定全解析 chapter2-2-1:2.0 新特性(二):新增事件ApplicationStartedEvent Web开发 chapter3-1-1:构建一个较为复杂的RESTful API以及单元测试 chapter3-1-2:使用Thymeleaf模板引擎渲染web视图 chapter3-1-3:使用Freemarker模板引擎渲染web视图 chapter3-1-4:使用Velocity模板引擎渲染web视图 chapter3-1-5:使用Swagger2构建RESTful API chapter3-1-6:统一异常处理 chapter3-1-7:使用Java 8LocalDate等时间日期类的问题解决 chapter3-1-8:扩展XML请求和响应的支持 数据访问 chapter3-2-1:使用JdbcTemplate chapter3-2-2:使用Spring-data-jpa简化数据访问层(推荐) chapter3-2-3:多数据源配置(一):JdbcTemplate chapter3-2-4:多数据源配置(二):Spring-data-jpa chapter3-2-5:使用NoSQL数据库(一):Redis chapter3-2-6:使用NoSQL数据库(二):MongoDB chapter3-2-7:整合MyBatis chapter3-2-8:MyBatis注解配置详解 chapter3-2-9:使用Flyway来管理数据库版本 chapter3-2-10:使用LDAP来统一管理用户信息 chapter3-2-11:Spring Boot增强对MongoDB的配置(连接池等) 事务管理 chapter3-3-1:使用事务管理 chapter3-3-2:[分布式事务(未完成)] 其他内容 chapter4-1-1:使用@Scheduled创建定时任务 chapter4-1-2:使用@Async实现异步调用 chapter4-1-3:使用@Async实现异步调用:自定义线程池 chapter4-1-4:使用@Async实现异步调用:资源优雅关闭 chapter4-1-5:使用@Async实现异步调用:使用Future以及定义超时 日志管理 chapter4-2-1:默认日志的配置 chapter4-2-2:使用log4j记录日志 chapter4-2-3:对log4j进行多环境不同日志级别的控制 chapter4-2-4:使用AOP统一处理Web请求日志 chapter4-2-5:使用log4j记录日志到MongoDB chapter4-2-6:Spring Boot 1.5.x新特性:动态修改日志级别] 安全管理 chapter4-3-1:使用Spring Security chapter4-3-2:[使用Spring Session(未完成)] 缓存支持 chapter4-4-1:注解配置与EhCache使用 chapter4-4-2:使用Redis做集式缓存 邮件发送 chapter4-5-1:实现邮件发送:简单邮件、附件邮件、嵌入资源的邮件、模板邮件 消息服务 chapter5-1-1:[JMS(未完成)] chapter5-2-1:Spring Boot使用RabbitMQ 其他功能 chapter6-1-1:使用Spring StateMachine框架实现状态机 Spring Boot Actuator监控端点小结 在传统Spring应用使用spring-boot-actuator模块提供监控端点 Spring Boot应用的后台运行配置 Spring Boot自定义Banner Dubbo进行服务治理 chapter9-2-1:Spring Boot使用Dubbo进行服务治理 chapter9-2-2:Spring Boot与Dubbo管理服务依赖
好的,下面是Spring Boot整合Ehcache解决Mybatis二级缓存数据脏读的详细步骤: 1. 添加依赖 首先,需要在pom.xml文件添加Ehcache和Spring Boot的相关依赖: ``` <!-- Ehcache依赖 --> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.6</version> </dependency> <!-- Spring Boot依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> ``` 2. 配置Ehcache 在src/main/resources目录下创建ehcache.xml文件,并添加以下配置: ``` <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false"> <!-- 默认缓存配置 --> <defaultCache maxEntriesLocalHeap="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskSpoolBufferSizeMB="30" maxEntriesLocalDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" statistics="true"> </defaultCache> <!-- Mybatis二级缓存配置 --> <cache name="com.example.demo.mapper.UserMapper" maxEntriesLocalHeap="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskSpoolBufferSizeMB="30" maxEntriesLocalDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" statistics="true"> </cache> </ehcache> ``` 在配置文件,我们定义了默认缓存配置和针对UserMapper的缓存配置。 3. 配置Mybatis 在application.properties添加Mybatis相关配置: ``` # Mybatis配置 mybatis.type-aliases-package=com.example.demo.entity mybatis.mapper-locations=classpath:mapper/*.xml mybatis.configuration.cache-enabled=true mybatis.configuration.local-cache-scope=session mybatis.configuration.cache-ref=ehcache ``` 注意,cache-enabled属性设置为true,local-cache-scope属性设置为session,并指定了使用的缓存提供者为Ehcache。 4. 配置缓存管理器 在启动类配置缓存管理器: ``` @Configuration @EnableCaching public class CacheConfig { @Bean public CacheManager cacheManager() { EhCacheCacheManager cacheManager = new EhCacheCacheManager(); cacheManager.setCacheManager(ehCacheManagerFactoryBean().getObject()); return cacheManager; } @Bean public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() { EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean(); cacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml")); cacheManagerFactoryBean.setShared(true); return cacheManagerFactoryBean; } } ``` 在这里,我们通过EhCacheCacheManager和EhCacheManagerFactoryBean来配置缓存管理器。 5. 开启缓存 最后,在Mapper接口开启缓存: ``` @CacheNamespace(implementation = net.sf.ehcache.Cache.class, eviction = FifoPolicy.class) public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{id}") @Options(useCache = true, flushCache = Options.FlushCachePolicy.FALSE, timeout = 10000) User selectById(Integer id); @Update("UPDATE user SET name = #{name} WHERE id = #{id}") void updateNameById(@Param("id") Integer id, @Param("name") String name); } ``` 使用@CacheNamespace注解来指定缓存实现类和缓存策略,在每个查询方法上使用@Options注解来开启缓存。 至此,Spring Boot整合Ehcache解决Mybatis二级缓存数据脏读的配置就完成了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值