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 一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的 ...
随机推荐
- 拷贝构造函数[c++]
拷贝构造函数何时会被调用? 1. 对象以值传递的方式传入函数参数 2.对象以值传递的方式从函数返回 3.对象需要通过另外一个对象进行初始化 下面我们来看代码: //#include <iostr ...
- matlab初级
命令 ======== 系统命令 命令 功能 例 date 显示当前日期 ans = 20-Jul-2019 what 当前文件夹下的matlab文件 type 文件中的内容 type CV.m ...
- Mybatis学习——Mybatis核心配置
MyBatis的核心配置 在使用MyBatis框架时,设计两个核心的d对象:SqlSessionFactory和SqlSession. SqlsessionFactory SqlSessionFact ...
- day59-mysql-存储过程、函数、事务、锁、备份
存储过程.函数不是重要的内容. 三. 存储过程:类似于函数(方法),简单的说存储过程是为了完成某个数据库中的特定功能而编写的语句集合, 该语句集包括SQL语句(对数据的增删改查).条件语句和循环语句等 ...
- 利用FastJson,拼接复杂嵌套json数据&&直接从json字符串中(不依赖实体类)解析出键值对
1.拼接复杂嵌套json FastJson工具包中有两主要的类: JSONObject和JSONArray ,前者表示json对象,后者表示json数组.他们两者都能添加Object类型的对象,但是J ...
- Java之常见异常
package com.atguigu.java1; import java.io.File;import java.io.FileInputStream;import java.util.Date; ...
- TPO6-1Powering the Industrial Revolution
The source had long been known but not exploited. Early in the eighteenth century, a pump had come i ...
- VS2015提示资源视图加载失败
关闭VS打开的resource,h这个文件,然后重启VS就行了.网上有很多其他的说法,我本地尝试始终不行,暴力解决. 今天发现,其实是不用重启的,直接对rc文件右键保存,就可以正常打开了......
- [SDOI2010]魔法猪学院(k短路)
A*板子题.我的code只能在luogu上过,bzoj上RE/MLE不清楚为啥. 蒟蒻到AFO前2个月不到的时间才学A*,A*其实就是bfs过程中进行剪支删除没必要的搜索.然后其实上这样剪支即可:如果 ...
- POJ-3264 Balanced Lineup(区间最值,线段树,RMQ)
http://poj.org/problem?id=3264 Time Limit: 5000MS Memory Limit: 65536K Description For the daily ...