Mybatis缓存
将用户经常查询的数据放入缓存(内存)中去,用户查询数据时直接从缓存中查询,提高了查询效率,解决了高并发中系统的性能问题。Mybatis中提供一级缓存与二级缓存。
Mybatis的一级缓存是一个SqlSession
级别的缓存,只能访问自己的一级缓存数据,而二级缓存是Mapper
级别的缓存,是跨SqlSession的
,不同的SqlSession
是可以共享缓存数据的。
一级缓存原理:
同一个SqlSession
再次发出相同的sql,就会从缓存中读取而不走数据库,如果两次操作之间出现commit(修改、输出、添加)
操作,那么本SqlSession
中一级缓存区域全部清空,下次再去缓存中查不到所以要从数据库中查询,从数据库再写入一级缓存。
注意
- Mybatis 中一级缓存是默认开启的,不需要手动配置。
- Mybatis 和 Spring 整合后进行 mapper 代理开发后,不支持一级缓存。Mybatis 和 Spring 整合,Spring 按照 mapper 的模板去生成 mapper 代理对象,模板中在最后会统一关闭 SqlSession。
二级缓存
二级缓存的范围是mapper级别(mapper同一个命名空间),mapper以命名空间为单位创建缓存数据结构,结构是map<key, value>。每次查询前看是否开启了二级缓存,如果开启则从二级缓存的数据结构中取缓存数据,如果二级缓存中没有取到,再从一级缓存中取,如果一级缓存也没有,那就从数据库中查询。
二级缓存配置
在Mybatis的配置文件中<settings>
标签中配置二级缓存:
<settings>
<setting name="cacheEnabled" value="true"/> <!--Mybatis的二级缓存配置-->
</settings>
Mybatis的二级缓存的范围是mapper级别的,因此我们mapper如果想要使用二级缓存,还需要在对应的映射文件中配置<cache>
标签
<mapper namespace="com.snow.xml.SnowOracle">
<cache></cache> <!--Mybatis的二级缓存配置-->
</mapper>
禁用二级缓存
有些情况下,我们需要打开二级缓存的配置,但是某个sql语句的查询变化频率较高,则需要针对该sql禁用二级缓存。在xml中statement中设置useCache=false 则可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认是true(使用二级缓存)
<select id="getEmployeeByName" parameterType="string" resultType="java.util.LinkedHashMap" useCache="false">
SELECT E.ID, E.EMPNAME, E.AGE, GB01.DMGRP, E.BIRTHDATE, E.SALARY, E.ADDRESS, GB02.DMGRP AS GRADE
FROM EMPLOYEE E LEFT JOIN GB01 ON E.SEX = GB01.ID LEFT JOIN GB02 ON E.GRADE = GB02.ID
WHERE E.EMPNAME = #{name}
</select><select id="getEmployeeByName" parameterType="string" resultType="java.util.LinkedHashMap" useCache="false">
SELECT E.ID, E.EMPNAME, E.AGE, GB01.DMGRP, E.BIRTHDATE, E.SALARY, E.ADDRESS, GB02.DMGRP AS GRADE
FROM EMPLOYEE E LEFT JOIN GB01 ON E.SEX = GB01.ID LEFT JOIN GB02 ON E.GRADE = GB02.ID
WHERE E.EMPNAME = #{name}
</select>
【参考】https://blog.csdn.net/zy_zhangruichen/article/details/122592504