11.延迟加载

白日梦想家12138 白日梦想家12138     2022-09-16     109

关键词:

延迟加载

  MyBatis 中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟规则推 迟对关联对象的 select 查询。延迟加载可以有效的减少数据库压力。 

需要注意的是,MyBatis 的延迟加载只是对关联对象的查询有迟延设置,对于主加载对象都是直接执行查询语句的。

 

  

  关联对象加载时机

MyBatis 根据对关联对象查询的 select 语句的执行时机,分为三种类型:直接加载、侵 入式延迟加载与深度延迟加载。

    1.直接加载:执行完对主加载对象的select语句,马上执行对关联对象的select查询

    2.侵入式延迟加载:执行完主加载对象的查询时,不会马上执行对关联对象。但当要访问主加载对象的详情时,

    就会马上执行关联对象的select查询。即对关联对象的查询执行,侵入到了主加载对象的详情中

    即将关联对象的详情作为主加载对象详情的一部分出现了

    3.深度延迟加载:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象 的详情时也不会执行关联对象的 select 查询。

    只有当真正访问关联对象的详情时,才会 执行对关联对象的 select 查询

 

需要注意的是,延迟加载的应用要求,关联对象的查询与主加载对象的查询必须是分别 进行的 select 语句,

不能是使用多表连接所进行的 select 查询。因为,多表连接查询,其实 质是对一张表的查询,

对由多个表连接后形成的一张表的查询。会一次性将多张表的所有信 息查询出来。

MyBatis 中对于延迟加载设置,可以应用到一对一、一对多、多对一、多对多的所有关 联关系查询中

 

 1 <!-- 三种加载方式:1.直接加载  2.侵入延迟加载   3.深度延迟加载  其中深度延迟加载最 lazy, 其次 是侵入延迟加载-->
 2     <settings>
 3         <!-- 延迟加载总开关-->
 4         <!-- 默认为false,不采用延迟加载,即采用直接加载 -->
 5         <!-- 直接加载:执行完主加载对象的 select 语句,马上执行关联对象的 select 语句 -->
 6         <!-- 因为侵入延迟加载 默认不开启,所以当开启延迟加载后,采用的 深度延迟加载(即用到了才去加载,发出SQL,在 hibernate 中是load方法 和 fetchType ,都是类似这种深度延迟加载 ) -->
 7         <setting name="lazyLoadingEnabled" value="true" />
 8         
 9         <!-- 侵入延迟加载的开关 默认为false,开启后,即采用侵入延迟加载 -->
10         <!-- 侵入延迟加载:该延迟策略使关联对象的数据侵入到了主加载对象的数据中,当主加载对象的数据被调用时,关联对象 随之被调用 ,即当对象中属性被使用后,就要发出SQL语句去加载关联对象-->
11         
12         <setting name="aggressiveLazyLoading" value="true"/>
13     </settings>

 

 

  延迟加载策略总结

 

ImageView RecyclerView 延迟加载

】ImageViewRecyclerView延迟加载【英文标题】:ImageViewRecyclerViewLazyLoad【发布时间】:2018-11-2110:11:10【问题描述】:我有一个RecyclerViewAdapter,它在onBindViewHolder中,我调用AsyncTask从GoogleCloudStorage下载所需的图像。RecyclerViewAdapter中有一... 查看详情

为啥 Angular 11 中的延迟加载组件是在新页面中加载的,而不是在侧边栏右侧的主页面中?

】为啥Angular11中的延迟加载组件是在新页面中加载的,而不是在侧边栏右侧的主页面中?【英文标题】:WhythelazyloadedcomponentinAngular11isloadedinanewpage,notinthemainpagetotherightofthesidebar?为什么Angular11中的延迟加载组件是在新页面中加载... 查看详情

图片延迟加载

jQueryLazyLoad图片延迟加载使用方法   <scriptsrc="js/jquery-1.11.1.min.js"></script>   <scriptsrc="js/jquery.lazyload.min.js"></script> $(function(){&nb 查看详情

我可以同时使用急切和延迟加载吗?

】我可以同时使用急切和延迟加载吗?【英文标题】:CanIuseeagerandlazyloadingatthesametime?【发布时间】:2019-11-1520:43:44【问题描述】:我有一个开启延迟加载的模型类。到目前为止,我一直使用延迟加载,例如为单个学生加载他的... 查看详情

nHibernate 需要延迟加载吗?

】nHibernate需要延迟加载吗?【英文标题】:IsLazyLoadingrequiredfornHibernate?【发布时间】:2010-10-2015:11:06【问题描述】:我花了很长时间,但我终于让nHibernate的HelloWorld工作了。在我进行“延迟加载”之后它起作用了。老实说,我无... 查看详情

如何在延迟加载中加载更多图像

】如何在延迟加载中加载更多图像【英文标题】:HowtoloadmoreimagesonLazyLoading【发布时间】:2013-03-1208:42:11【问题描述】:在muUITable视图中,我正在显示来自服务器的图像..为此我正在使用延迟加载。当行在屏幕上时,我可以加载... 查看详情

SPPlaybackManager - 延迟和加载

】SPPlaybackManager-延迟和加载【英文标题】:SPPlaybackManager-latencyandloading【发布时间】:2014-04-0122:11:29【问题描述】:我正在使用SPPlaybackManager播放曲目,但在播放的一些小而重要的方面遇到了困难。曲目正在加载和流式传输,但... 查看详情

使用 LazySizes 延迟加载轮播图像

】使用LazySizes延迟加载轮播图像【英文标题】:LazyloadingacarouselimageswithLazySizes【发布时间】:2017-11-2620:21:32【问题描述】:我正在使用Lazysizes在我的AngularJs应用程序中延迟加载轮播。如果我对图像进行延迟大小调整,它可以工作... 查看详情

延迟加载 - (实体框架)底层连接意外关闭

】延迟加载-(实体框架)底层连接意外关闭【英文标题】:LazyLoading-(EntityFramework)TheUnderlyingConnectionwasClosedUnexpectedly【发布时间】:2015-11-1111:58:03【问题描述】:我正在尝试使用实体框架实现延迟加载。我会提前承认我从来没有... 查看详情

使用 DTO 在实体框架中延迟加载

】使用DTO在实体框架中延迟加载【英文标题】:DeferredloadinginEntityFrameworkusingDTO【发布时间】:2014-04-2802:11:27【问题描述】:我对使用实体框架的延迟加载功能一直面临的这个问题感到非常困惑。我知道触发数据库查询的扩展,... 查看详情

Windows 中的延迟加载

】Windows中的延迟加载【英文标题】:Delay-LoadinWindows【发布时间】:2014-11-2600:02:22【问题描述】:我试图了解一些代码(直接改编自PyCXX)。它是一个多平台C++Python包装器。编辑:原始代码here。它似乎迎合了一些只存在于Windows中... 查看详情

Spring JPA 延迟加载 - 无法初始化代理

】SpringJPA延迟加载-无法初始化代理【英文标题】:SpringJPALazyLoading-CouldNotInitializeProxy【发布时间】:2015-11-0117:24:21【问题描述】:下面是一些背景代码:InitiativeProfileQuestion.java:@Entity@TablepublicclassInitiativeProfileQuestionimplementsSeriali... 查看详情

Angular 9 嵌套延迟加载模块,带有嵌套路由器出口

】Angular9嵌套延迟加载模块,带有嵌套路由器出口【英文标题】:angular9nestedlazyloadedmoduleswithnestedrouteroutlets【发布时间】:2020-10-0117:11:56【问题描述】:我正在尝试使用Angular9开发SPA,我几乎尝试延迟加载每个组件及其所有子组... 查看详情

Angular 6 - 指定延迟加载块的路径

】Angular6-指定延迟加载块的路径【英文标题】:Angular6-Specifypathforlazyloadedchunks【发布时间】:2018-11-1502:22:25【问题描述】:我有一个带有子模块的主模块,最初我想让这些模块快速加载,所以我做了什么:第一次尝试-渴望加载im... 查看详情

我应该获取加入所有延迟加载的实体吗?

】我应该获取加入所有延迟加载的实体吗?【英文标题】:ShouldIfetchjoinalltheentitiesthatarelazilyloaded?【发布时间】:2021-11-2705:34:13【问题描述】:我目前正在使用JPA和queryDSL开发一个Web项目。据我所知,fetchjoin是用来减少执行延迟... 查看详情

Java JDBC 延迟加载的结果集

】JavaJDBC延迟加载的结果集【英文标题】:JavaJDBCLazy-LoadedResultSet【发布时间】:2010-11-0207:33:00【问题描述】:有没有办法让你通过运行JDBC查询获得的ResultSet被延迟加载?我希望按照我的要求而不是事先加载每一行。【问题讨论... 查看详情

首次加载时显示collectionView的底部,无需滚动和延迟加载

】首次加载时显示collectionView的底部,无需滚动和延迟加载【英文标题】:ShowthebottomofcollectionViewonfirstloadwithoutscrollingandlazyloading【发布时间】:2019-11-0806:15:27【问题描述】:我开发了一个聊天应用程序,我在其中将MessageKit用于... 查看详情

延迟切换uiviews

】延迟切换uiviews【英文标题】:Delayswitchinguiviews【发布时间】:2013-11-0413:15:55【问题描述】:当我按下UIBUTTON以从一个uiview切换到下一个时,按钮保持按下状态-可能是因为正在加载下一个uiview(应该加载一个JSON数组)并且几秒... 查看详情