MyBatis延迟加载及缓存
延迟加载 lazyLoadingEnabled
定义: MyBatis中的延迟加载也成为懒加载,就是在进行关联查询的时候按照设置延迟加载规则推迟对关联对象的select检索。延迟加载可以有效的减少数据库的压力。延迟加载只对关联对象的查询有延迟设置,对于主加载对象都是直接执行查询语句的。
时机:1.直接加载
2.侵入式延迟加载(aggressiveLazyLoading) 也可看做立即加载
3..深度延迟加载
直接加载:即执行对象的select语句完成对主加载马上执行对关联对象的select查询
侵入式延迟加载:执行对主加载对象的查询时,不会执行对关联对象的查询。但是当要访问主加载对象的详情时马上执行对关联对象的select查询。即对关联对象的执行查询,侵入到了主加载对象的访问详情中。也可理解为:将关联对象的详情侵入到主加载对象的详情中去,即将关联对象的详情作为主加载对象的一部分出现了!
深度延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的select查询
<settings>
<!--开启延迟加载-->
<setting name="lazyLoadingEnabled" value="true"></setting>
<!--关闭侵入式延迟加载-->
<setting name="aggressiveLazyLoading" value="false"></setting>
</settings>
lazyLoadingEnabled : 默认为false 延迟加载的全局开关
aggressiceLazyLoading : 所谓侵入式加载,就是在启用时(true) 对任意加载属性的调用会使带有延迟加载属性的对象完整加载,反之,每种属性将会按照需要加载。默认为true
MyBatis缓存
使用缓存可以使应用更快地获取数据,避免和数据库的频繁地交互,尤其是在查询越多、缓存命中率越高的情况下,使用缓存的作用也就越明显。MyBatis作为持久性的ORM框架,提供了非常强大的查询缓存特性,可以非常方便的配置和使用。
在MyBatis中分为一级缓存和二级缓存,MyBatis缓存的作用域是在映射文件的namespace去划分的,相同namespace的mapper查询缓存放在相同的区域,反之放在不用的位置,且不同区域的缓存互不干扰。
其中一级缓存是在一次会话范围内有效,即同一个SqlSession范围内,而二级缓存是可以在不用同的Sqlsession中共享数据的。(证明一级缓存的存在,可以在同一个SqlSession中调用两次相同的查询语句,用log4j打印发送的SQL语句,如果只发送一条,证明一级缓存存在。log4j的配置文件可以上网找)
一级缓存是默认开启的无需进行配置,且在进行增删改操作的时候,同时会对缓存中的数据进行相同的操作,即缓存中的数据与数据库中的数据保持一致
MyBatis的二级缓存是一个外部的插件,使用二级缓存首先要导入依赖
<!--引入需要的ehcache插件-->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>1.2.3</version>
</dependency>
<!--mybatis整合ehcache的jar-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.0.0</version>
</dependency>
其次需要一个配置文件:ehcache.xml(这个名字是固定的,想要改变那你就自己去改变源码中的数据)
以下是ehcache.xml文件中的属性
Ø maxElementsInMemory:在内存中最大的存储量
Ø eternal:是否在内存中永远不销毁
Ø timeToIdleSeconds:在缓存中闲置多少时间之后销毁,默认单位是S
Ø timeToLiveSeconds:在缓存中存活多少时间之后销毁,无论是否有人使用,默认单位是S
Ø overflowToDisk:当缓存满的时候是否保存到磁盘中
Ø diskPersistent:磁盘中的文件是否永久保存
Ø diskExpiryThreadIntervalSeconds:检测线程运行时间间隔!默认单位是S
Ø memoryStoreEvictionPolicy:缓存清理策略:
1.LRU(least recently used) 最近最少使用每个缓存的元素都有一个时间戳,当缓存容量满的时候,需要腾出来新位置给新缓存元素,这时候,会比较时间戳然后 删除符合条件的缓存元素
2.LFU (least frequently used )最少使用一直以来最少使用的缓存元素,缓存 元素中有一个hit值,hit值最少的将会清除!
3.FIFO(first in first out) 先进先出
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!--文件位于resources目录下-->
<!--临时文件目录 可以自己设置-->
<diskStore path="D:/"/>
<!--
maxElementsInMemory:在内存中最大的存储量
eternal:是否在内存中永远不销毁
timeToIdleSeconds:在缓存中闲置多少时间之后销毁,默认单位是S
timeToLiveSeconds:在缓存中存活多少时间之后销毁,无论是否有人使用,默认单位是S
overflowToDisk:当缓存满的时候是否保存到磁盘中
diskPersistent:磁盘中的文件是否永久保存
diskExpiryThreadIntervalSeconds:检测线程运行时间间隔!默认单位是S
memoryStoreEvictionPolicy : 缓存清理策略
1.LRU (least recently used) 最近最少使用
每个缓存的元素都有一个时间戳,当缓存容量满的时候,需要腾出来新位置给新缓存元素,
这时候,会比较时间戳然后删除符合条件的缓存元素
2.LFU (least frequently used )最少使用
一直以来最少使用的缓存元素,缓存元素中有一个hit值,hit值最少的将会清除!
3.FIFO(first in first out) 先进先出
-->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
同时需要在映射文件中添加以下节点:
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
在全局配置文件中添加setting节点:
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"></setting>
这样二级缓存就开启了,可以自行进行测试检查结果
结论:
Ø 二级缓存不比一级缓存,需要在configuration.xml中手动开启。
Ø 二级缓存是全局应用级别的缓存,即使关闭了session仍能使用。
Ø 如果一个select标签想要局部关闭二级缓存,需要设置useCache=false
Ø 二级缓存不能使用注解方法配置
Ø 如果在执行增删改操作的过程中不刷新缓存,须设置flushCache=false
MyBatis延迟加载及缓存的更多相关文章
- MyBatis延迟加载和缓存
一.延迟加载 1.主对象的加载: 根本没有延迟的概念,都是直接加载. 2.关联对象的加载时机: 01.直接加载: 访问主对象,关联对象也要加载 02.侵入式延迟: 访问主对象,并不加载关联对象 访问主 ...
- MyBatis延迟加载和缓存(4)
一.项目创建 1.项目目录结构 2.数据库配置和上一篇的一样,这里不再描述.下面创建mybatis配置文件SqlMapConfig.xml <?xml version="1.0&quo ...
- Mybatis延迟加载、缓存
一.Mybatis中的延迟加载 1.延迟加载背景:Mybatis中Mapper配置文件中的resultMap可以实现高级映射(使用association.collection实现一对一及一对多(多对多 ...
- (二)MyBatis延迟加载,一级缓存,二级缓存
延迟加载配置: 什么时候用延迟加载?比如现在有班级和学生表,一对多关系,你可能只需要班级的信息,而不需要该班级学生的信息,这时候可以进行配置,让查询时先查询到班级的信息,在之后需要学生信息时候,再进行 ...
- MyBatis 延迟加载,一级缓存,二级缓存设置
什么是延迟加载 resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再去加载关联信息 ...
- Mybatis延迟加载和查询缓存
摘录自:http://www.linuxidc.com/Linux/2016-07/133593.htm 阅读目录 一.延迟加载 二.查询缓存 一.延迟加载 resultMap可以实现高级映射(使用a ...
- mybatis多参数传递,延迟加载,缓存,注解开发
1.Mybatis的多参数传递方式 需求:更具id 和 名字查询用户: select * from user where id = ? and name = ?: 1):QueryVo 或者 User ...
- Mybatis学习(五)————— 延迟加载和缓存机制(一级二级缓存)
一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的数据的话,就不查询从表的信息.所以这就是突出了懒这个特点.真是懒啊. Mybati ...
- Mybatis(五) 延迟加载和缓存机制(一级二级缓存)
踏踏实实踏踏实实,开开心心,开心是一天不开心也是一天,路漫漫其修远兮. --WH 一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的 ...
随机推荐
- csv文件——简单读操作01
转载:https://www.py.cn/spider/advanced/14381.html import csv with open('C:\\Users\\del\\Desktop\\123.c ...
- Java--Excel操作
public static List<Info> readXml(String fileName, Map<String, Fuck> pcMap) throws Except ...
- 1. 现代 javascript 用法 简介 及 babel
简介 包含 ECMAScript 基本概念,babel 使用 ,eslint 使用 以及新语法的介绍 和使用经验 ECMAScript 概念 ECMASctipt 是一种由 Ecma (前身为欧洲计算 ...
- 信号分析——从傅里叶变化到FFT
我们眼中的世界就像皮影戏的大幕布,幕布的后面有无数的齿轮,大齿轮带动小齿轮,小齿轮再带动更小的. 在最外面的小齿轮上有一个小人——那就是我们自己. 我们只看到这个小人毫无规律的在幕布前表演,却无法预测 ...
- Docker部署freeswitch
1. clone配置文件到本地服务器 git clone https://github.com/BetterVoice/freeswitch-container.git 相关Dockerfile如下: ...
- python3 str.encode bytes.decode
str.encode 把字符串编码成字节序列 bytes.decode 把字节序列解码成字符串 https://docs.python.org/3.5/library/stdtypes.html st ...
- 寒假day05-spring框架
1.回顾事务 l 事务:一组业务操作ABCD,要么全部成功,要么全部不成功. l 特性:ACID 原子性:整体 一致性:完成 隔离性:并发 持久性:结果 l 隔离问题: 脏读:一个事务读到另一个事务没 ...
- 题解 P4171 【[JSOI2010]满汉全席】
什么,tarjan?那是什么? 码量太大,我选择放弃 为什么不用dfs写2-sat呢?他会伤心的说 这题2-sat的过程大佬们已经讲得非常清楚了,我就略微提一下,主要讲dfs的原理 2_sat原理 我 ...
- 使用tcpdump查看HTTP请求响应 详细信息 数据
安装tcpdump: sudo yum install tcpdump 查看get请求: tcpdump -s 0 -A 'tcp dst port 80 and tcp[((tcp[12:1] &a ...
- Random Access Iterator
Random Access Iterator 树型概率DP dp[u]代表以当前点作为根得到正确结果的概率 将深度最深的几个点dp[u]很明显是1 然后很简单的转移 有k次,但我们要先看一次的情况,然 ...