Mybatis学习笔记(五)- mybatis二级缓存原理

2024-04-03 17:48

本文主要是介绍Mybatis学习笔记(五)- mybatis二级缓存原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在前边的学习中我们大概得了解了mybatis扫描和注入原理和sql的执行过程,还有mybatis插件的原理,在后边我们学习了mybatis的一级缓存的原理。那么今天我们主要学习一下mybatis二级缓存吧!

@Overridepublic Listquery(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql)throws SQLException {
只有是select类型的查询才有缓存可言Cache cache = ms.getCache();if (cache != null) {
//如果需要就删除当前缓存flushCacheIfRequired(ms);if (ms.isUseCache() && resultHandler == null) {ensureNoOutParams(ms, boundSql);@SuppressWarnings("unchecked")
从缓存中获取,获取不到的话就先填入一个值List list = (List) tcm.getObject(cache, key);if (list == null) {list = delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
将结果添加到缓存tcm.putObject(cache, key, list); // issue #578 and #116}return list;}}return delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);}

清空当前缓存

 

private void flushCacheIfRequired(MappedStatement ms) {Cache cache = ms.getCache();if (cache != null && ms.isFlushCacheRequired()) {tcm.clear(cache);}}public Object getObject(Cache cache, CacheKey key) {return getTransactionalCache(cache).getObject(key);}

如果二级缓存没有那么就添加进去

private TransactionalCache getTransactionalCache(Cache cache) {return transactionalCaches.computeIfAbsent(cache, TransactionalCache::new);}

同样我们也发现在执行非select查询的时候,二级缓存会清理

同样的如果我们使用事务,那么缓存也会在执行结束之后进行释放。

当发生事务回滚的时候也会将之前加入的缓存key给清理掉

 public void rollback() {unlockMissedEntries();reset();}private void unlockMissedEntries() {for (Object entry : entriesMissedInCache) {try {delegate.removeObject(entry);} catch (Exception e) {log.warn("Unexpected exception while notifiying a rollback to the cache adapter."+ "Consider upgrading your cache adapter to the latest version.  Cause: " + e);}}}

分析到这里可能有人就问了,这个sqlsession会回收的时候,这里的cache会不会被回收掉。答案是肯定得,因为executor是sqlsession的私有变量,cachemanager是executor的私有变量。所以二级缓存其实也会在事务提交的时候进行释放。据此我们做一些相关的测试。

1.关闭一级缓存,开启二级缓存,使用事务。预期会走缓存查询,但是第二次请求会重新建立缓存不会使用第一次请求产生的缓存。

2.关闭一级缓存,开启二级缓存,不使用事务,预期走缓存,但是第二次请求不会使用缓存。

但是作者通过实验发现springboot中并没有提供二级缓存相关的开关,也就是说springboot可能已经抛弃了mybatis的二级缓存。毕竟这里边和业务以及项目整合会有脏数据产生。

通过上述分析,作者并没有发现二级缓存与项目同生共死的作用。反而觉得二级缓存的可用性更低。为什么这么说的原因是每次查询sql,其实都是存sqlsesion池中获取sqlsession,而sqlsession的创建的参数就是executor,executor就是根据我们配置新建的,所以我们的缓存作为executor的私有变量显然也是新的。当然我们还发现cacheexecutor中对事务相关的接口,显然事务操作也会使得二级缓存无效。所以根据作者的分析,二级缓存且不说可能有多么厉害,就这些点个人觉得还没有一级缓存好用。但可能作者的反编译器不够出色,不能看到真相。以后有机会再回过头细细品味吧,就目前来说springboot已经没有二级缓存相关的开启配置了!

这篇关于Mybatis学习笔记(五)- mybatis二级缓存原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/873579

相关文章

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

mybatis映射器配置小结

《mybatis映射器配置小结》本文详解MyBatis映射器配置,重点讲解字段映射的三种解决方案(别名、自动驼峰映射、resultMap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录select中字段的映射问题使用SQL语句中的别名功能使用mapUnderscoreToCame

mybatis-plus如何根据任意字段saveOrUpdateBatch

《mybatis-plus如何根据任意字段saveOrUpdateBatch》MyBatisPlussaveOrUpdateBatch默认按主键判断操作类型,若需按其他唯一字段(如agentId、pe... 目录使用场景方法源码方法改造首先在service层定义接口service层接口实现总结使用场景my

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱