Mybatis - 提高(1)-缓存
一、缓存的使用
Mybatis 中有两个对象持有缓存:CachingExecutor 以及 BaseExecutor
(一)一级缓存
一级缓存的作用域是 session,当 openSession()后,如果执行相同的 SQL(相同语句和参数),Mybatis 不执行 sql,而是从缓存中命中返回。
在 mybatis 中,一级缓存默认是开启的,并且一直无法关闭。
一级缓存满足条件:
- 同一个 session 中
- 相同的 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" />