MyBatis 懒加载 一级缓存 二级缓存(一)

目录

背景

MyBatis 懒加载

MyBatis 一级缓存

MyBatis 二级缓存


背景

最近在读《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:弱引用,更积极的移除基于垃圾回收器状态及弱引用规则的对象

 

 

 

 

 

 

 

 

参考文档

Mybatis延迟加载的实现以及使用场景

Mybatis的二级缓存配置

mybatis开启二级缓存

《Spring+MYBatis企业应用实战》读书笔记

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章