一.概述
1.MyBatis跟缓存相关的类都在cache包里面,其中有一个Cache接口,只有一个默认的实现类PerpetualCache,它是用HashMap实现的,除此之外,还有很多的装饰器,通过这些装饰器可以额外实现很多的功能
2.所有的缓存实现类总体可分为三类:
基本缓存,淘汰算法缓存,装饰器缓存
二.一级缓存
1.特点:
1)一级缓存是在会话(SqlSession)层面进行缓存的
2)默认是开启的,不需要任何的配置
3)PerpetualCache对象是放在Executor里面维护的-------SimpleExecutor/ReuseExecutor/BatvhExecutor的父类BaseExecutor的构造函数中持有了PerpetualCache,而Executor是DefaultsqlSession里面的一个属性
在同一个会话里面,多次执行相同的 SQL 语句,会直接从内存取到缓存的结果,不 会再发送 SQL 到数据库。但是不同的会话里面,即使执行的 SQL 一模一样(通过一个 Mapper 的同一个方法的相同参数调用),也不能使用到一级缓存。
2.一级缓存什么时候会失效?
答:在同一会话中,uodate会导致一级缓存被清空
3,如果跨会话,会出现什么问题?
其他会话更新了数据,导致读取 到脏数据(一级缓存不能跨会话共享)
4.一级缓存的不足:
使用一级缓存的时候,因为缓存不能跨会话共享,不同的会话之间对于相同的数据可能有不一样的缓存,在有多个会话或者分布式环境下,会存在脏数据的问题,如果要解决这个问题,就要用到二级缓存