mybatis缓存机制

mybatis缓存机制

摘自《Spring+Mybatis企业应用实战》

mybatis的查询分为一级缓存和二级缓存

  • 一级缓存是SqlSession级别的缓存
  • 二级缓存是mapper级别的缓存,二级缓存是多个SqlSession共享的
一级缓存(SqlSession级别)

一级缓存是SqlSession级别的缓存。mybatis使用hashMap作为存储缓存数据,使用id作为key。不同sqlSession之间缓存数据区域(HashMap)是相互不影响的。如果SqlSessioin执行DML操作(insert,update和delete),并提交到数据库,mybatis会清空SqlSession中的一级缓存。这样做的目的就是为了保证缓存中存储的是最新的数据,避免出现脏读的现象。mybatis默认开启一级缓存。

*使用id作为key,形如:
-1932640473:4314250821:com.github.xxx.dao.CountryDao.getById:0:2147483647:SELECT * FROM country WHERE country_id = ?:1:SqlSessionFactoryBean*

这里写图片描述

<setting name="localCacheScope" value="SESSION"/>
二级缓存(mapper级别)

mybatis二级缓存是mapper级别的缓存。二级缓存同样是基于HashMap进行缓存数据。二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace。mybatis默认没有开启二级缓存,需要在全局参数中开启二级缓存:

<!-- false 代表禁用二级缓存 -->
<setting name="cacheEnabled" value="true"/>

<!-- 使用cashe -->
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>

cache中的属性:

  • flushInterval: 刷新间隔。毫秒数,默认是不设置,也就是没有刷新时间
  • size: 缓存对象的数目。默认是1024
  • readOnly: 只读。默认是false,只读的缓存意味着返回的对象不能被修改
  • eviction: 回收策略,默认是LRU
    • LRU: 最近最少使用,移除最长时间不被使用的对象
    • FIFO:先进先出,按对象进入缓存的顺序来移除
    • SOFT: 软引用策略,移除基于垃圾回收器状态各软引用规则的对象
    • WEAk: 弱引用策略,更积极移除基于垃圾回收器状态和弱引用规则的对象

使用二级缓存的时候,查询结果映射的java对象需要实现java.io.Serializable接口,因为二级缓存可以使用第三方缓存介质(如ehcache),不一定在内存,有可能在磁盘或者是服务器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值