MyBatis与Spring继承:一级缓存

一级缓存设计理念:
在一个Session内,不更新缓存,直接清空缓存。只有SqlSession不关闭,就不会过期。不限制

与spring集成

加了@Transactional注解的区别
与spring集成
mybatis一级缓存源码解读类图
MyBatis与Spring集成
未开启事务
每次请求,Spring都会关闭旧的session在创建新的session,所以此时一级缓存无效。
开启事务
在一个事务内,Spring通过ThreadLocal始终使用同一个session,所以此时一级缓存在事务内有效。
MyBatis一级缓存的设计理念
MyBatis一级缓存是在一个Session内有效的。
一级缓存在一个Session内,有以下特性:
不过期:只要SqlSession存在,没有关闭、提交...这个缓存一直存在。
不更新:Update时只直接清空这个缓存,而不是更新这个缓存的实例。
不限制:不限制一级缓存实例对象的数量。
由于不限制实例对象的数量,故可能会占用大量内存,但实际不用担心:
一般情况下Session的生存时间很短
执行Update会销毁缓存
支持主动销毁缓存
核心:控制Session生存时间!!!
Update更新,清空缓存 对应代码,如图
包含update、instert、delete
Rollback回滚,清空缓存 对应代码,如图
Commit提交,清空缓存 对应代码,如图
缓存Session关闭,清空缓存 对应代码,如图
一级缓存的五个命中原则 对应的代码,如图
一级缓存类图:
蓝色框为MyBatis定义的接口。
绿色框为实现一种装饰模式。
结论:MyBatis一级缓存存储的实际上是Map数据结构。
缓存key
一级缓存类图
mybatis一级缓存设计特点:在同一个session内
不过期:缓存没有过期时间
不更新:发生写操作时是直接清空缓存,而不是更新缓存
不限制:缓存的key值个数不限制
mybatis和sping整合,在有事务的情况下,两次查询是同一个sqlsession(底层通过threadlocal实现),所以可以命中一级缓存,而没有事务控制的时候则是分别开启一个sqlsession
mybatis一级缓存实际上就是一个hashmap