mybatis缓存学习分享

一、MyBatis缓存介

     正如大多数持久层框架一样,MyBatis 同样提供了一级缓存二级缓存的支持

     1.一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空

 2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。

二、一级缓存

一级缓存存在于sqlsession的生命周期中,在同一个sqlsession中查询时,mybatis会把查询方法和参数通过算法生成缓存的主键值,把主键和查询结果存放到map中。如果同一个sqlsession中执行的执行方法和参数完全一致。那么会通过算法返回相同的对象。insert、update、delete操作都会清空一级缓存。
一级缓存默认是开启的,如果先取消select 的一级缓存,在selete配置中配置属性flushCache="ture"。
<select id="selectAllCity"   flushCache="true" resultMap="cityResultMapper">

三、二级缓存

      二级缓存不同于一级缓存的是存在的生命周期是同一个SqlSessionFactory。 二级缓存是mapper级别的缓存,值得注意的是,不同的mapper通常情况下有不同的namespace,就都有一个二级缓存,也就是说,不同的mapper之间的二级缓存是互不影响的。 二级缓存配置,默认是开启的, 在主配置文件中添加  在setings中增加如下配置关闭二级缓存。

<seting name="cacheEnabled" value="false">

      在XxxMapper.xml文件中配置二级缓存策略

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

eviction:缓存策略FIFO:First In First Out ,LRU:Least Recently Used

flushInterval:缓存刷新时间间隔,时间是毫秒,检查是否存在过期对象

size:缓存中存储的对象个数

readOnly:是否只读

myabatis二级缓存脏数据产生的原因。如果是多变关联的查询语句,如果表中的数据如果是在其他mapper文件中多表中的数据进行增删改,不会刷新缓存,因为二级缓存和命名空间绑定的。解决办法是几个会关联的表用使用同一一个二级缓存。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值