一级缓存
一级缓存默认会启用,想要关闭一级缓存可以在 select 标签上配置 flushCache=“true”;一级缓存存在于 SqlSession 的生命周期中,在同一个 SqlSession 中查询时, MyBatis 会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个 Map 对象中。如果同一个 SqlSession 中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当Map 缓存对象中己经存在该键值时,则会返回缓存中的对象;任何的 INSERT 、UPDATE 、DELETE 操作都会清空一级缓存;
二级缓存
二级缓存也叫应用缓存,存在于 SqlSessionFactory 的生命周期中,可以理解为跨 sqlSession;
缓存是以 namespace 为单位的,不同 namespace 下的操作互不影响。在 MyBatis 的核心配置文件中 cacheEnabled 参数是二级缓存的全局开关,默认值是 true,如果把这个参数设置为false,即使有后面的二级缓存配置,也不会生效;要开启二级缓存,你需要在你的 SQL Mapper 文件中添加配置:
缓存调用注意事项:
- 每次与数据库的连接都会优先从缓存中获取数据
- 先查二级缓存,再查一级缓存
- 二级缓存以 namespace 为单位的,是 SqlSession 共享的,容易出现脏读,建议避免使用二级缓存
- 一级缓存是 SqlSession 独享的,建议开启