这里写目录标题
一. 概念
1.1 定义
缓存是存在于内存中的临时数据;
1.2 作用
查询的时候从缓存读取,能减少和数据库的交互,提高效率;
1.3 使用场景
(1)适合用缓存:
- 经常查询并且不常改变的;
- 数据的正确与否对最终结果影响不大;
(2)不适合用缓存:
- 经常改变的数据;
- 数据的正确与否对结果影响较大的;
二. MyBatis一级缓存
2.1 引入
当使用Mybatis进行数据库的操作时候,会创建一个SqlSession
来进行一次数据库的会话,会话结束则关闭SqlSession对象。
如果我们很有可能多次查询完全相同的sql语句,每一次查询都查询一次数据库,那查询数据库代价是比较大的,这会导致系统的资源浪费;
为了解决这个问题,Mybatis对每一次会话都添加了缓存操作,相同的SQL不用再查数据库;
2.2 简介
一级缓存是 默认开启 的。
一级缓存作用域是sqlsession
级别的;
同一个sqlsession中执行相同的sql查询(相同的sql和参数),第一次会去查询数据库并写到缓存中,后序的查询将会从一级缓存读取,而不会查数据库,提升了效率。
2.3 生命周期
MyBatis在开启一个数据库会话时,会创建一个新的SqlSession
对象,当会话结束时,SqlSession对象会被释放掉。
即一级缓存的生命周期是一次会话。
三. MyBatis二级缓存(全局缓存)
3.1 简介
二级缓存是 默认关闭 的。
二级缓存是 Mapper
映射文件级别的缓存,多个 SqlSession 去操作同一个 Mapper 的 sql 语句,多个 SqlSession 可以共享二级缓存,二级缓存是跨 SqlSession 的全局变量。
当 Mybatis 调用 Dao 层查询数据库时,先查询二级缓存,二级缓存中无对应数据,再去查询一级缓存,一级缓存中也没有,最后去数据库查找。
3.2 何时存入
在关闭sqlsession后(close),才会把该sqlsession一级缓存中的数据添加到namespace的二级缓存中。
开启了二级缓存后,还需要将要缓存的pojo实体类实现Serializable接口,为了将缓存数据取出执行反序列化操作,因为二级缓存数据存储介质多种多样,不一定只存在内存中,有可能存在硬盘中。
3.3 过期时间
当存取数据的时候,都有检测一下cache的生命时间,默认是1小时,如果这个cache存活了一个小时,那么将整个清空一下。
参考:
https://blog.csdn.net/guorui_java/article/details/118095020
https://mikechen.cc/17833.html
https://zhuanlan.zhihu.com/p/388720463