mybatis中的一级缓存和二级缓存

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。每次查询前看是否开启了二级缓存,如果开启则从二级缓存的数据结构中取缓存数据,如果二级缓存中没有取到,再从一级缓存中取,如果一级缓存也没有,那就从数据库中查询。

二级缓存配置

在Mybatis的配置文件中标签中配置二级缓存:

<settings>
    <setting name="cacheEnabled" value="true"/> 
settings>

Mybatis的二级缓存的范围是mapper级别的,因此我们mapper如果想要使用二级缓存,还需要在对应的映射文件中配置标签

<mapper namespace="com.snow.xml.SnowOracle">
    <cache>cache> 
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

你可能感兴趣的:(Mybatis,mybatis,缓存,oracle)