目录
背景
最近在读《Spring+MYBatis企业应用实战》(别问我为什么要看这么旧的书,因为我只是一个小垃圾),里面讲到了懒加载、一级缓存、二级缓存,以前也了解过概念,那时候还没有开发经验,只是照本宣科的记下来,现在有了实践体会,一并记下来。
MyBatis 懒加载
懒加载也就是延迟加载。在一对多的映射关系中,我们可能不希望在进行主表数据查询的时候,同步的查询明细表。只有当访问明细表属性的时候,也就是我们需要使用明细表数据的时候,再进行明细表数据的查询(SQL执行)。这也正是懒加载机制的使用场景。
开启懒加载,只需要加一下全局配置就好。
<!--延迟加载全局开关,当值为true时,所有关联对象都会延迟加载,默认为false-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--属性为true时,会使所有延迟加载的属性立即加载, 所以要配置为false-->
<setting name="aggressiveLazyLoading" value="false"/>
MyBatis 查询缓存
我们一般的业务场景,都是读的频率高于写的频率的,所以数据库的压力一般都来自于查询。MyBtis提供了一级缓存和二级缓存来缓解数据库的查询压力。
MyBatis 一级缓存
一级缓存是sqlSession级别的,也就是说缓存数据的作用域是sqlSession范围的,不同的sqlSession,缓存数据是隔离的。即同一sqlSession,执行一次SQL查询,就会将数据缓存到内存中,之后若无DML操作(create、update、delete),再次进行相同查询时,将会从内存中读取数据,不会再次执行SQL。若执行了DML操作并提交到数据库,则会清空缓存,避免出现读取脏数据。一级缓存默认开启,无需配置。
MyBatis 二级缓存
二级缓存是mapper级别的,通过mapper的namespace来区分。不同的mapper,缓存数据是隔离的;不同的sqlSession,二级缓存是共享的。即同一mapper,执行一次SQL查询,就会将数据缓存到内存中,之后若无DML操作(create、update、delete),再次进行相同查询时,将会从内存中读取数据,不会再次执行SQL。若执行了DML操作并提交到数据库,则会清空缓存,避免出现读取脏数据。二级缓存默认关闭,需要配置如下。
config.xml
<!--开启全局二级缓存-->
<setting name="cacheEnabled" value="true"/>
mapper.xml中开启缓存
<cache/>
缺省状态下,都采用默认配置。也可以修改为自己指定的配置,配置项如下
配置项 | 说明 |
---|---|
flushInterval | 刷新间隔,默认不刷新 |
size | 缓存数目,默认1024 |
readOnly | 缓存对象是否只读,默认为false |
eviction |
回收策略,默认是LRU。有以下几种策略: LRU:最近最少使用 FIFO:先进先出 SOFT:软引用,基于垃圾回收器状态和软引用规则的对象 WEAK:弱引用,更积极的移除基于垃圾回收器状态及弱引用规则的对象 |
参考文档