一级缓存:是SqlSession级别的缓存,缓存的数据只在SqlSession内有效(默认开启)
具体流程:
- 第一次执行select完毕会将查到的数据写入SqlSession内的HashMap中缓存起来
- 第二次执行select会从缓存中查数据,如果select相同且传参数一样,那么就能从缓存中返回数据,不用去数据库了,从而提高了效率
注意事项:
- 如果SqlSession执行了DML操作(insert、update、delete),并commit了,那么mybatis就会清空当前SqlSession缓存中的所有缓存数据,这样可以保证缓存中的存的数据永远和数据库中一致,避免出现脏读
- 当一个SqlSession结束后那么他里面的一级缓存也就不存在了,mybatis默认是开启一级缓存,不需要配置
- mybatis的缓存是基于[namespace:sql语句:参数]来进行缓存的,意思就是,SqlSession的HashMap存储缓存数据时,是使用[namespace:sql:参数]作为key,查询返回的语句作为value保存的。例如:-1242243203:1146242777:winclpt.bean.userMapper.getUser:0:2147483647:select
- from user where id=?:19
二级缓存:是mapper级别的缓存,同一个namespace公用这一个缓存,所以对SqlSession是共享的
1.核心配置:
2.在userMapper.xml中配置:
Cache参数说明
flushInterval(刷新间隔) | 可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,由mybatis每隔一段时间自动清空缓存 |
size(引用数目) | 可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024 |
readOnly(只读) | 属性可以被设置为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false |
Eviction(收回策略, 默认的是 LRU) | LRU – 最近最少使用的:移除最长时间不被使用的对象。 FIFO – 先进先出:按对象进入缓存的顺序来移除它们。 SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。 WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象 |
3.useCache配置禁用二级缓存:
//针对每次查询都需要最新的数据sql,要设置成useCache=false,禁用二级缓存
4.mybatis刷新缓存(就是清空缓存):
在mapper的同一个namespace中,如果有其它insert、update、delete操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。<insertid=“insertUser” parameterType=“cn.itcast.mybatis.po.User”
flushCache=“true”> //一般执行完commit操作都需要刷新缓存,默认情况下为true
5.二级应用场景:
对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。
6.扩展:
resultType和resultMap的区别: resultType:只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
resultMap:如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
注意:调用的pojo要类实现序列化接口;