Mybatis - 提高(1)-缓存

131 阅读1分钟

Mybatis - 提高(1)-缓存

一、缓存的使用

Mybatis 中有两个对象持有缓存:CachingExecutor 以及 BaseExecutor

(一)一级缓存

一级缓存的作用域是 session,当 openSession()后,如果执行相同的 SQL(相同语句和参数),Mybatis 不执行 sql,而是从缓存中命中返回。

在 mybatis 中,一级缓存默认是开启的,并且一直无法关闭。

一级缓存满足条件:

  1. 同一个 session 中
  2. 相同的 SQL 和参数
@Test
public void testQueryUserById() {
    System.out.println(this.userMapper.queryUserById("1"));
    System.out.println(this.userMapper.queryUserById("1"));
}

只会显示一次查询过程。

使用:sqlSession.clearCache();可以强制清除缓存。

@Test
public void testQueryUserById() {
    System.out.println(this.userMapper.queryUserById("1"));
    sqlSession.clearCache();
    System.out.println(this.userMapper.queryUserById("1"));
}

执行 update、insert、delete 的时候,会清空缓存。

(二)二级缓存

mybatis 的二级缓存的作用域是一个 mapper 的 namespace ,同一个 namespace 中查询 sql 可以从缓存中命中。

开启二级缓存:

<mapper namespace="com.hantangtouzi.htblog.dao.UserMapper">
    <cache/>
</mapper>
@Test
public void testCache() {
    System.out.println(this.userMapper.queryUserById("1"));

    sqlSession.close();
    SqlSession sqlSession = sqlSessionFactory.openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    System.out.println(mapper.queryUserById("1"));
}

开启二级缓存,必须序列化:

关闭二级缓存: 不开启,或者在全局的 mybatis-config.xml 中去关闭二级缓存

<settings>
    <!--开启驼峰匹配-->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <!--开启二级缓存,全局总开关,这里关闭,mapper中开启了也没用-->
    <setting name="cacheEnabled" value="false"/>
</settings>

cache 的高级配置

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />