Mybatis 缓存

欢迎光临我的博客[http://poetize.cn],前端使用Vue2,聊天室使用Vue3,后台使用Spring Boot

一级缓存

一级缓存:SqlSession级别的缓存,基于PerpetualCache的HashMap本地缓存,其存储作用域为同一个SqlSession


public class Start2 {
    public static void main(String[] args) throws IOException {
        
        String resource = "mybatis-config.xml";
        InputStream  inputStream = Resources.getResourceAsStream(resource);
        //创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //true表示自动提交。否则需要使用commit方法才会提交。默认是false
        SqlSession session = sqlSessionFactory.openSession();

        //拿到接口的代理对象
        Dao dao=session.getMapper(Dao.class);

        //拿到了dao这个对象接下来就可以创建sql语句了(直接调用接口方法)
        List list1 = dao.selAll();
        //再做一次重复查询(由于设置了一级缓存,查询速度很快)
        List list2 = dao.selAll();
        session.commit();
    }
}


一级缓存是默认开启的,当创建SqlSession对象时候就开启了。

一级缓存通过简单Map集合来实现,并没有对Map集合的大小,容量进行限制
一级缓存是一个粗粒度的缓存,没有办法去精确控制缓存中的数据是否过期以及去更新缓存数据

一级缓存中数据的有效期

默认是开启的,如果不想用缓存,直接在select节点中增加 useCache="false" 和 flushCache="true" 属性即可。

flushCache:将其设置为true,无论语句什么时候被调用,都会导致缓存被清空,避免数据库脏读。

<select id="articles" parameterType="int" resultMap="result" useCache="false" flushCache="true">
	select user.name from user where user.id = #{id}
</select>


SqlSession对象调用clearCache()方法的时候,会自动清除缓存中的数据。SqlSession对象还是可以正常使用。

SqlSession对象关闭的时候,SqlSession对象就不能再使用了,缓存会失效。
mybatis整合spring,一级缓存会失效,因为mybatis会在每次查询之后自动关闭sqlSession。

当在两次相同的查询中间穿插了 新增 修改 删除 操作,也会清除缓存中的数据。

二级缓存(避免使用)

mybatis的二级缓存是基于application为生命周期

默认采用基于PerpetualCache的HashMap存储,其存储作用域为Mapper(Namespace)。

当某一个作用域(二级缓存Namespaces)进行了C/U/D操作后,默认该作用域下所有select中的缓存将被clear。


MyBatis 默认没有开启二级缓存,开启只需在 mybatis-config.xml 配置文件中写入如下代码:

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


mapper.xml中:

	<!-- 回收策略为先进先出 -->
	<!-- 自动刷新时间60s -->
	<!-- 最多缓存512个引用对象 -->
	<!-- 只读 -->
	<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

useCache=false:禁用二级缓存。


避免使用原因:
	多个Mapper(Namespace)可能对同一个表有相同的操作,会发送错误(两个命名空间下的数据不一致)
posted @ 2019-09-24 21:11  LittleDonkey  阅读(223)  评论(0编辑  收藏  举报