JUST SO SO之mybatis 缓存机制
来源:互联网 发布:淘宝达人的粉丝怎么买 编辑:程序博客网 时间:2024/05/21 17:51
1.缓存机制图
如上所言,一个SqlSession对象会使用一个Executor对象来完成会话操作,Executor对象会维护一个Cache缓存,以提高查询性能,这就是一级缓存;
MyBatis的二级缓存机制的关键就是对这个Executor对象做文章。如果用户配置了"cacheEnabled=true",那么MyBatis在为SqlSession对象创建Executor对象时,会对Executor对象加上一个装饰者:CachingExecutor,这时SqlSession使用CachingExecutor对象来完成操作请求。CachingExecutor对于查询请求,会先判断该查询请求在Application级别的二级缓存中是否有缓存结果,如果有查询结果,则直接返回缓存结果;如果缓存中没有,再交给真正的Executor对象来完成查询操作,之后CachingExecutor会将真正Executor返回的查询结果放置到缓存中,然后在返回给用户。
MyBatis的二级缓存设计得比较灵活,你可以使用MyBatis自己定义的二级缓存实现;你也可以通过实现org.apache.ibatis.cache.Cache接口自定义缓存;也可以使用第三方内存缓存库
2.一级缓存
2.1概念:一级缓存是Session会话级别的缓存,位于表示一次数据库会话的SqlSession对象之中,又被称之为本地缓存。一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认情况下自动支持的缓存,用户没有定制它的权利(可以通过开发插件对它进行修改);
2.2工作原理:由于MyBatis使用SqlSession对象表示一次数据库的会话,那么,对于会话级别的一级缓存也应该是在SqlSession中控制的。
实际上, MyBatis只是一个MyBatis对外的接口,SqlSession将它的工作交给了Executor执行器这个角色来完成,负责完成对数据库的各种操作。当创建了一个SqlSession对象时,MyBatis会为这个SqlSession对象创建一个新的Executor执行器,而缓存信息就被维护在这个Executor执行器中,MyBatis将缓存和对缓存相关的操作封装成了Cache接口中。SqlSession、Executor、Cache之间的关系如下列类图所示:
如上图所示Executor的实现类BaseExecutor是通过Cache的实现类PerpetualCache来维护的;
2.3生命周期:
a. MyBatis在开启一个数据库会话时,会 创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象,Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。
b. 如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用;
c. 如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用;
d.SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用;
2.4工作流程:
MyBatis认为,对于两次查询,如果以下条件都完全一样,那么就认为它们是完全相同的两次查询:
1. 传入的 statementId
2. 查询时要求的结果集中的结果范围 (结果的范围通过rowBounds.offset和rowBounds.limit表示);
3. 这次查询所产生的最终要传递给JDBC Java.sql.Preparedstatement的Sql语句字符串(boundSql.getSql() )
4. 传递给java.sql.Statement要设置的参数值
3.二级缓存
3.1概念:二级缓存是Application应用级别的缓存,它的是生命周期很长,跟Application的声明周期一样,也就是说它的作用范围是整个Application应用。
3.3生命周期:由于二级缓存是基于应用层面的,它的是生命周期很长,跟Application的声明周期一样,也就是说它的作用范围是整个Application应用。
3.4工作流程:当开一个会话时,一个SqlSession对象会使用一个Executor对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个Executor对象做文章。如果用户配置了"cacheEnabled=true",那么MyBatis在为SqlSession对象创建Executor对象时,会对Executor对象加上一个装饰者:CachingExecutor,这时SqlSession使用CachingExecutor对象来完成操作请求。CachingExecutor对于查询请求,会先判断该查询请求在Application级别的二级缓存中是否有缓存结果,如果有查询结果,则直接返回缓存结果;如果缓存中没有,再交给真正的Executor对象来完成查询操作,之后CachingExecutor会将真正Executor返回的查询结果放置到缓存中,然后在返回给用户。
- JUST SO SO之mybatis 缓存机制
- JUST SO SO 之redis
- JUST SO SO之JVM
- JUST SO SO 之spring
- JUST SO SO之 MySQL
- JUST SO SO之spring事务
- just so so
- just so so
- JUST SO SO
- JUST SO SO之centOs 下 nginx安装
- JUST SO SO之常见JAVA类型比对
- CSDN博客,JUST SO SO
- JUST SO SO之多线程
- HAL so库加载机制---之二
- so
- so...
- so
- So.
- 对C/C++内存分配的思考与总结
- I have a date with Algorthim.
- 数据类型及auto、static、register…
- const和volatile详解
- 引入jar包之Error:Execution failed for task ':app:transformClassesWithDexForDebug
- JUST SO SO之mybatis 缓存机制
- 结构体及柔性数组
- Centos安装gcc及g++
- C语言符号技巧总结
- Linux-Centos下的git配置使用
- gcc与g++的区别(转贴)
- 关于Git的安装
- linux内核进程创建分析
- 编译预处理