mybatis 的 延迟加载 和 查询缓存

延迟加载

1.1什么是延迟加载
延迟加载又叫懒加载,也叫按需加载。也就是说先加载主信息,在需要的时候,再去加载从信息。

在mybatis中,resultMap标签 的association标签和collection标签具有延迟加载的功能。

1.2需求
查询订单信息,关联查询用户信息
1、创建一个statement来查询订单信息
2、创建一个statement来查询用户信息

1.3映射文件

1、创建查询订单信息的映射文件
mybatis 的 延迟加载 和 查询缓存
mybatis 的 延迟加载 和 查询缓存
2、创建查询用户信息的映射文件
mybatis 的 延迟加载 和 查询缓存
1.4Mapper接口
mybatis 的 延迟加载 和 查询缓存
1.5测试代码
mybatis 的 延迟加载 和 查询缓存
1.6设置延迟加载
在SqlMapConfig.xml中,配置settings标签
mybatis 的 延迟加载 和 查询缓存

2.查询缓存

1.1Mybatis的缓存理解
mybatis 的 延迟加载 和 查询缓存
Mybatis的缓存,包括一级缓存和二级缓存

一级缓存指的就是sqlsession,在sqlsession中有一个数据区域,是map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。

二级缓存指的就是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。

一级缓存是默认使用的。
二级缓存需要手动开启。

2.2一级缓存

2.2.1原理
mybatis 的 延迟加载 和 查询缓存

2.2.2测试1
mybatis 的 延迟加载 和 查询缓存
2.2.3测试2
mybatis 的 延迟加载 和 查询缓存
mybatis 的 延迟加载 和 查询缓存

2.3二级缓存

2.3.1原理
mybatis 的 延迟加载 和 查询缓存

2.3.2开启二级缓存

1、开启二级缓存的总开关
mybatis 的 延迟加载 和 查询缓存
2、在mapper映射文件中开启二级缓存
mybatis 的 延迟加载 和 查询缓存
2.3.3序列化
mybatis 的 延迟加载 和 查询缓存
2.3.4测试1
mybatis 的 延迟加载 和 查询缓存
mybatis 的 延迟加载 和 查询缓存
2.3.5测试2
mybatis 的 延迟加载 和 查询缓存
mybatis 的 延迟加载 和 查询缓存
2.3.6禁用缓存

默认值是true
mybatis 的 延迟加载 和 查询缓存
2.3.7刷新缓存
mybatis 的 延迟加载 和 查询缓存
2.3.8整合ehcache
Mybatis本身是一个持久层框架,它不是专门的缓存框架,所以它对缓存的实现不够好,不能支持分布式。

Ehcache是一个分布式的缓存框架。

2.3.8.1什么是分布式
系统为了提高性能,通常会对系统采用分布式部署(集群部署方式)
mybatis 的 延迟加载 和 查询缓存
2.3.8.2整合思路
Cache是一个接口,它的默认实现是mybatis的PerpetualCache。如果想整合mybatis的二级缓存,那么实现Cache接口即可。
mybatis 的 延迟加载 和 查询缓存
2.3.8.3添加jar包
mybatis 的 延迟加载 和 查询缓存
2.3.8.4设置映射文件中cache标签的type值为ehcache的实现类
mybatis 的 延迟加载 和 查询缓存
2.3.8.5添加ehcache的配置文件
在config下,创建ehcache.xml
mybatis 的 延迟加载 和 查询缓存
2.3.8.6测试ehcache的二级缓存
mybatis 的 延迟加载 和 查询缓存
2.3.9应用场景
使用场景:对于访问响应速度要求高,但是实时性不高的查询,可以采用二级缓存技术。
注意:在使用二级缓存的时候,要设置一下刷新间隔(cache标签中有一个flashInterval属性)来定时刷新二级缓存,这个刷新间隔根据具体需求来设置,比如设置30分钟、60分钟等,单位为毫秒。

2.3.10局限性
Mybatis二级缓存对细粒度的数据,缓存实现不好。
场景:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次查询都是最新的商品信息,此时如果使用二级缓存,就无法实现当一个商品发生变化只刷新该商品的缓存信息而不刷新其他商品缓存信息,因为二级缓存是mapper级别的,当一个商品的信息发送更新,所有的商品信息缓存数据都会清空。
解决此类问题,需要在业务层根据需要对数据有针对性的缓存。
比如可以对经常变化的 数据操作单独放到另一个namespace的mapper中。

over~~~