延迟加载  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延迟加载及缓存的更多相关文章

  1. MyBatis延迟加载和缓存

    一.延迟加载 1.主对象的加载: 根本没有延迟的概念,都是直接加载. 2.关联对象的加载时机: 01.直接加载: 访问主对象,关联对象也要加载 02.侵入式延迟: 访问主对象,并不加载关联对象 访问主 ...

  2. MyBatis延迟加载和缓存(4)

    一.项目创建 1.项目目录结构 2.数据库配置和上一篇的一样,这里不再描述.下面创建mybatis配置文件SqlMapConfig.xml <?xml version="1.0&quo ...

  3. Mybatis延迟加载、缓存

    一.Mybatis中的延迟加载 1.延迟加载背景:Mybatis中Mapper配置文件中的resultMap可以实现高级映射(使用association.collection实现一对一及一对多(多对多 ...

  4. (二)MyBatis延迟加载,一级缓存,二级缓存

    延迟加载配置: 什么时候用延迟加载?比如现在有班级和学生表,一对多关系,你可能只需要班级的信息,而不需要该班级学生的信息,这时候可以进行配置,让查询时先查询到班级的信息,在之后需要学生信息时候,再进行 ...

  5. MyBatis 延迟加载,一级缓存,二级缓存设置

    什么是延迟加载 resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再去加载关联信息 ...

  6. Mybatis延迟加载和查询缓存

    摘录自:http://www.linuxidc.com/Linux/2016-07/133593.htm 阅读目录 一.延迟加载 二.查询缓存 一.延迟加载 resultMap可以实现高级映射(使用a ...

  7. mybatis多参数传递,延迟加载,缓存,注解开发

    1.Mybatis的多参数传递方式 需求:更具id 和 名字查询用户: select * from user where id = ? and name = ?: 1):QueryVo 或者 User ...

  8. Mybatis学习(五)————— 延迟加载和缓存机制(一级二级缓存)

    一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的数据的话,就不查询从表的信息.所以这就是突出了懒这个特点.真是懒啊. Mybati ...

  9. Mybatis(五) 延迟加载和缓存机制(一级二级缓存)

    踏踏实实踏踏实实,开开心心,开心是一天不开心也是一天,路漫漫其修远兮. --WH 一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的 ...

随机推荐

  1. 使用log4cxx

    在java中有log4j日志模块,使用起来非常方便,在C++中也是有的,log4cxx就是log4j的c++移植版,机缘巧合之下今天想要使用一下这个日志模块,所以记录下自己从一开始下载安装到成功使用的 ...

  2. A - Color the ball HDU - 1556 (差分数组+前缀和)

    思路等引自博客 https://blog.csdn.net/johnwayne0317/article/details/84928568 对数组a[7]: a[0]=1; = d[0] a[1]=1; ...

  3. MySQL--SHOW ENGINE INNODB STATUS

    ===================================== -- :: 0x7f305b965700 INNODB MONITOR OUTPUT =================== ...

  4. 利用salt-stack 对多台分布式应用进行简单部署jar包项目:

    /appsystems/JQM-SERVER/shell/stopServer.sh:                                         ----用脚本停止应用 cmd. ...

  5. 十二星座 英文名:Aries 金牛座 (4/21 - 5/20)的英文名: Taurus 双子座 (5/21 - 6/21)的英文名: Gemini 巨蟹座 (6/22 - 7/22)的英文名: Cancer 狮子座 (7/23 - 8/22)的英文名: Leo 处女座/室女座 (8/23 - 9/22)的英文名: Virgo 天秤座 (9/2

    十二星座的具体顺序是:白羊座(Aries).金牛座(Taurus).双子座(Gemini).巨蟹座(Cancer).狮子座(Leo).处女座(Virgo).天秤座(Libra).天蝎座(Scorpio ...

  6. Spring Cloud Alibaba 教程 | Nacos(六)

    集群模式部署 前面我们已经学习了Nacos作为注册中心.配置中心的相关功能,但是我们之前启动Nacos是通过单实例模式启动的,只适合在学习和开发阶段,生产环境需要保证Nacos的高可用,所以今天我们来 ...

  7. Ubuntu---Git

    本篇文章简单总结了常用 Git 的使用 前言 设置用户信息 1, Git 是分布式的 SSH 代码管理工具,远程的代码管理是基于 SSH 的,所以要使用远程的 Git 则需要 SSH 的配置. ste ...

  8. UML-如何进行面向对象设计?

    1.开发者如何设计对象? 1).直接编码 2).uml图,然后编码 3).uml图,不编码 绘图要轻量的 2.并行创建若干模型 如:5分钟画交互图,5分钟画类图.反复交替 3.选择什么样的UML CA ...

  9. tensorflow object detection api android

    https://blog.csdn.net/weixin_40355324/article/details/80651350

  10. BZOJ4059[Cerc2012]Non-boring sequences(扫描线/分治)

    这题正解应该是扫描线,就是发现DP的区间在两个维度都为连续段,于是可以直接扫描线.但不幸的是,扫描线常数过大,无法通过本题. 考虑分治.对于分治区间[l,r],可以记录pre和nxt表示其前/后一次出 ...