为了提升查询效率和减少数据库的查询压力,mybatis提供了一级和二级缓存。
mybatis的缓存是在Cache接口中,它只有一个默认的实现类PerpetualCache,用HashMap实现,剩下的都是装饰类
一级缓存
一级缓存是在sqlSession层面的,所以在参数和sql完全一样的情况下查询才会走一级缓存。默认开启,不需要任何的配置。
存放位置:sqlSession实现类DefaultSqlSession中的Executor属性,存放了缓存,Executor的实现类BaseExecutor中的PerpetualCache localCache;
二级缓存
可以解决一级缓存不能跨会话共享的问题。范围是namespace级别,只要是同一个namespace可以被多个session共享。生命周期和应用同步。
开启方法:
第一步:<setting name="cacheEnabled" value="true"/> 在主配置文件中配置cacheEnabled属性,默认为true。
第二步:在Mapper中配置<cache/>标签。配置了之后,select会被缓存,update,delete,insert会刷新缓存。
<select id="selectBlog" resultMap="BaseResultMap" useCache="false"> useCache="false" 关闭当前statementid二级缓存
存放位置: 存储在Executor的装饰类CachingExecutor中(TransactionalCache真正持有了cache对象),其实CachingExecutor是对BaseExecutor的装饰。取数据时,先看二级缓存有没有命中,在查看一级缓存。
执行流程:
2,如果有两个namespace对同一张表进行了操作,那么可能导致脏数据。<cache-ref>标签可以解决跨namespace缓存共享的问题。
<cache-ref namespace="com.gupaoedu.crud.dao.DepartmentMapper" />,这种情况下,多个Mapper的操作都会引起缓存的刷新,缓存的意义已经不大了。