1. 什么情况下用缓存
如果在极短的时候内,做相同的查询,那么它们的结果很可能是相同,而访问一次数据库是非常消耗资源的,如果有一层缓存,将极大减少资源的消耗。
另外项目中要加载固定的某些数据,比如下拉框中加载一些不常变动的数据,又比如Tree绑定的数据不经常发生变化的,这些数据都可以写入缓存。
2. 缓存的使用顺序
二级缓存 > 一级缓存 > 数据库
3. 一级缓存
一级缓存的作用域是SqlSession范围的,当在同一个SqlSession中执行两次相同的SQL语句时,第一次执行完毕会将数据库中查询的数据写到缓存(一级内存),第二次查询时会从缓存中获取数据,不再去数据库查询,从而提高查询效率。
提示:如果SqlSession执行了DML操作(insert、update、delete),并提交到数据库,MyBatis则会清空SqlSession中的一级缓存,目的是为了保存缓存中存储的是最新的数据,避免出现脏读现象。
当一个SqlSession结束后,该SqlSession中的一级缓存也就不存在了。
4. 二级缓存
二级缓存存在于SqlSessionFactory生命周期中。
二级缓存是多个sqlSession对象共享的,其作用域是Mapper的同一个namespace。不同的 SqlSession两次执行相同的namespace下的SQL语句,且向SQL中传递的参数也相同,即最终执行相同的SQL语句。则第一次执行完毕后会将数据库中查询的数据写到一级缓存(内存),第二次查询时会从缓存中获取数据,不再去数据库查询。
要关闭sqlsession,才会把数据保存到二级缓存