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

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

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

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

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

<!--开启user支持二级缓存-->
<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中的。即在一级缓存拿到的是同一个对象;而在二级缓存中拿到的是各项属性值都相同的两个不同的对象,两个对象的地址不一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值