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 一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的 ...
随机推荐
- P1618 三连击(升级版)
题解: #include<stdio.h>int main(){ int A,B,C; scanf("%d %d %d",&A,&B,&C); ...
- 用Axure画原型图有感
感觉前端做UE非常有优势啊- 但是在制作的时候,似乎陷入了误区: (1)只求原型图的漂亮,色彩丰富,忽略了其本质作用,是用来整理逻辑,画出逻辑流程的. (2)一开始就追求交互,高保真的原型,忽视了细节 ...
- Springboot整合Junit单元测试
1.在pom.xml中添加junit环境的依赖 <dependency> <groupId>org.springframework.boot</groupId> & ...
- 转:以下是目前已经建立的sub一览 来自:https://zhuanlan.zhihu.com/p/91935757
转:以下是目前已经建立的sub一览 来自:https://zhuanlan.zhihu.com/p/91935757 作者: Lorgar 理工科 科学(和英文r/science一样,只接受论文讨论 ...
- 微服务项目开发学成在线_Vue.js与Webpack
Vue.js 1.Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.自底向上逐层应用:作为渐进式框架要实现的目标就是方便项目增量开发. 渐进式框架:Progress ...
- python图像处理:一福变五福
快过年了,各种互联网产品都出来撒红包.某宝一年一度的“集五福活动”更是成为每年的必备活动之一. 虽然到最后每人大概也就分个两块钱,但作为一个全民话题,大多数人还是愿意凑凑热闹. 毕竟对于如今生活在大城 ...
- android仿网易云音乐引导页、仿书旗小说Flutter版、ViewPager切换、爆炸菜单、风扇叶片效果等源码
Android精选源码 复现网易云音乐引导页效果 高仿书旗小说 Flutter版,支持iOS.Android Android Srt和Ass字幕解析器 Material Design ViewPage ...
- @ResponseBody与@RestController
@ResponseBody与@RestController的作用与区别 https://blog.csdn.net/xfl4629712/article/details/78528387
- 讯飞语音的中的bug用户校验失败
用户校验失败:原因是目录没有复制粘贴正确. 下面是刚刚下载的SDK目录: 下面的是自己Android工程中的目录:注意复制粘贴的文件路径要正确
- 【转】Fst指数
[转]Fst指数 转载自 http://blog.csdn.net/zhu_si_tao/article/details/71513099 与 http://blog.sina.com.cn/s/bl ...