一级缓存
作用范围:SqlSession级别。
当我们使用一条sql语句之后,sql语句会作为key值,查询结果会作为value值,存储起来,在第二次执行到这个sql语句的时候,就会去查询key,然后把value取出来作为返回结果,这样就节省了一次数据库资源,而且提升了速度。
上面就可以看出,虽然进行了两次查询,但实际上只用了一次查询语句,这就是缓存机制的作用,节约资源。
当然,如果你在两次查询操作中进行了增删改的操作,缓存会自动被清空。mybatis会帮你执行sqlSession.clearCache();来清空缓存。
二级缓存
作用范围:SessionFactory级别
默认开启,可以在"mybatis-config.xml"的settings中关闭。true为开,false为关。
要使用还需要在XXXDao.xml文件中加入一个标签,表示可以使用二级缓存。
还需要把我们的pojo进行序列化。
当我们在任意SqlSession中使用查询语句,关闭一次SqlSession,就会提交一次缓存,当下一次在其他SqlSession使用查询的时候,将会根据namespace.sql作为key去查询对应的value值。
在同一namespace范围下,执行增删改操作,会清空该namespace的缓存。
二级缓存有一个问题,比如我们在做关联查询的时候,account关联user。第一次查询account,会查询出account和user的数据保存到缓存。这个时候我们单单对user进行了操作,数据已经变了,但是当我们再一次查询account的时候,由于第一次查询account的缓存还在,就会直接从缓存当中拿,user数据就是过时的。