前引
mybatis一级缓存和二级缓存是经常出现在面试中的一道题目,想要区分一级缓存和二级缓存首先要了解mybtis中比较重要的几个类的生命周期。
SqlSessionFactory
SqlSessionFactory是mybatis启动时读取所有配置文件后创建的一个全局的对象。它在mybatis启动时开始创建,直到mybatis关闭时销毁。存在于整个生命周期中。
SqlSessionFactoryBuilder
SqlSessionFactoryBuilde是用于创建SqlSessionFactory对象的,建造者模式。方法级别的变量。
SqlSession
SqlSession代表一次数据的连接,本身是线程不安全的。生命周期是方法级别的。
SqlMapper
包含了java中mapper接口和xml所有信息,需要执行的sql、结果集、请求参数和映射规则等。是线程级别的变量。
一级缓存
一级缓存默认是会启动的,想要关闭一级缓存在<select>标签上配置flushCache=“true”;一级缓存存在于SqlSession的生命周期中,在同一个SqlSession中查询时,Mybatis会把执行的命名空间、方法和参数通过算法生成缓存的key,将结果当成value存入到一个map对象中。如果同一个SqlSession中再次执行的方法和入参完全一致时,会命中一级缓存。任何的insert、update和delete操作都会清空一级缓存。
二级缓存
二级缓存也叫应用缓存,存在于SqlSessionFactory的生命周期中,是命名空间级别的。跨SqlSession级别的。缓存是以命名空间为key,不同命名空间下的操作互补影响。在 MyBatis 的核心配置 文件中 cacheEnabled 参数是二级缓存的全局开关,默认值是 true,如果把这个参数设置为 false,即使有后面的二级缓存配置,也不会生效; 要开启二级缓存,你需要在你的 SQL Mapper 文件中添加配置:
<cache eviction=“LRU" flushInterval="60000" size="512" readOnly="true"/>
缓存调用过程:
1. 每次与数据库的连接都会优先从缓存中获取数据
2. 先查二级缓存,再查一级缓存
3. 二级缓存以 namespace 为单位的,是 SqlSession 共享的,容易出现脏读,建议避免使用 二级缓存