Mybatis的一级缓存和二级缓存详解

在mybatis中,缓存有两种。一种是一级缓存,一种是二级缓存。

一级缓存是存在于sqlSession对象中的,只要sqlSession对象还在,sqlSession对象产生的代理对象就可以拿得到一级缓存的数据。当sqlSession对象被回收或者调用clearCache()方法清理缓存时,该SqlSession对象的一级缓存的数据就会被清空。
二级缓存是存在于生产sqlSession对象的工厂SqlSessionFactory的实例化对象factory中。所有同一个factory生产的sqlSession对象都可以拿到二级缓存的数据,但是二级缓存默认是关闭的。如果想要开启二级缓存,需要以下三个步骤:
首先,在主配置文件SqlMapConfig中配置:

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

然后在接口对应的配置文件中打开二级缓存


<cache/>

在该配置文件的sql语句中添加(useCache=“true”)打开二级缓存,例:

 <select id="findById" parameterType="INT" resultType="user" useCache="true">
     select * from user where id = #{uid}
 select>

总结:
一级缓存和二级缓存的级别应该是基于代理对象的,代理对象的上一级是SqlSession,所以称之为一级缓存,一级缓存存在于SqlSession对象中。而factory又是生产SqlSession的,也就是代理对象的上一级的上一级,就是二级缓存,二级缓存存在于factory中。

一级缓存存在于SqlSession中,所以同一个SqlSession对象产生的代理对象都可以拿到SqlSession中的缓存数据。二级缓存存在于factory中,同一个factory产生的各个SqlSession产生的所有代理对象都可以拿到factory中的缓存数据。

在不清理缓存的情况下,sqlSession对象在,其对应的一级缓存就在;factory对象在,其对应的二级缓存就在。

一级缓存是默认打开的,可以直接拿来用,而二级缓存则需要手动打开。

一级缓存是以对象的形式缓存在factory中的,而二级缓存是以数据的形式缓存在sqlSesssion中的。即在一级缓存拿到的是同一个对象;而在二级缓存中拿到的是各项属性值都相同的两个不同的对象,两个对象的地址不一样。

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