你能解释一下延迟加载吗?
目录
介绍
那么我们如何实现延迟加载呢?
.NET中有没有现成的对象可以用来实现延迟加载?
延迟加载的优缺点是什么?
介绍
延迟加载是一个概念,我们将对象的加载延迟到我们需要它的时候。简而言之,按需加载对象而不是不必要地加载对象。
例如,考虑下面的例子,我们有一个简单的Customer类,这个Customer类里面有很多Order对象。仔细看看Customer类的构造函数。当Customer对象被创建时,它也在那一刻加载Order对象。因此,即使我们需要或不需要该Order 对象,它仍然会被加载。
但是,最初只加载Customer对象然后按需加载Order对象怎么样?
public class Customer
{private List<Order> _Orders= null;……public Customer(){_CustomerName = "Shiv";_Orders = LoadOrders(); // Loads the order object even though //not needed}private List<Order> LoadOrders(){List<Order> temp = new List<Order>();Order o = new Order();o.OrderNumber = "ord1001";temp.Add(o);o = new Order();o.OrderNumber = "ord1002";temp.Add(o);return temp;}
}
因此,让我们考虑您有使用Customer类的客户端代码,如下所示。因此,当Customer创建Order对象时,此时不应加载任何对象。但是只要foreach循环运行,您就希望在该点加载Order对象(按需加载对象)。
Customer o = new Customer(); // order object not loaded
Console.WriteLine(o.CustomerName);
foreach (Order o1 in o.Orders) // Load order object only at this moment
{Console.WriteLine(o1.OrderNumber);
}
那么我们如何实现延迟加载呢?
对于上面的例子,如果我们要实现延迟加载,我们需要做如下修改:
- 从构造函数中删除Order对象加载。
- 在Order get属性中,仅当未加载对象时才加载该Order对象。
public class Customer
{private List<Order> _Orders= null;……public Customer(){_CustomerName = "Shiv";}public List<Order> Orders{get {if (_Orders == null){_Orders = LoadOrders();}return _Orders; }}
现在,如果您运行客户端代码并在foreach循环运行Orders对象之前停止调试器,您可以看到Orders对象是null(即,未加载)。但是一旦foreach循环运行在Order对象上,它就会创建Order对象集合。
.NET中有没有现成的对象可以用来实现延迟加载?
在.NET中,我们有一个Lazy<T>为延迟加载提供自动支持的类。那么我们假设如果要在上面的代码中实现Lazy<>,我们需要实现两个步骤:
使用Lazy泛型类创建订单对象。
private Lazy<List<Order>> _Orders= null;
将此Lazy<>对象附加到有助于我们加载订单数据的方法。
_Orders = new Lazy<List<Order>>(() => LoadOrders());
现在,只要任何客户端调用该_Orders对象,它就会调用该LoadOrders函数来加载数据。
您将获得Value属性中的List<orders>数据。
public List<Order> Orders
{get {return _Orders.Value; }
}
下面是完整的代码:
public class Customer
{private Lazy<List<Order>> _Orders= null;public List<Order> Orders{get {return _Orders.Value; }}public Customer(){// Makes a database trip_CustomerName = "Shiv";_Orders = new Lazy<List<Order>>(() => LoadOrders());}
}
延迟加载的优缺点是什么?
以下是延迟加载的优点:
- 最大限度地减少应用程序的启动时间。
- 由于按需加载,应用程序消耗的内存更少。
- 避免了不必要的数据库SQL执行。
唯一的缺点是代码变得复杂。由于我们需要检查是否需要加载,因此性能略有下降。
但优点远远多于缺点。
仅供参考:延迟加载的反面是预先加载。因此,在预先加载中,我们在创建对象后立即将所有对象加载到内存中。
https://www.codeproject.com/Articles/652556/Can-You-Explain-Lazy-Loading
你能解释一下延迟加载吗?相关推荐
- 小白学习java之mybatis第三天
第16节:延迟加载策略 首先说明什么是延迟加载及应用场景.特别要说明mybatis应用延迟加载的前得条件必须是嵌套方式才可以.其次解释使用延迟加载可减少访问数据库的频率,减少系统资源的消耗从而提高my ...
- 一些关于Hibernate延迟加载的误区
最近面试别人,正好出的笔试题中有道关于Hibernate延迟加载的问题,聊天过程中发现很多人对Hibernate的延迟加载有些理解误区,写 些东东在这里,希望对大家有所帮助. 首先是第一个误区:延迟加 ...
- Mybatis(五) 延迟加载和缓存机制(一级二级缓存)
踏踏实实踏踏实实,开开心心,开心是一天不开心也是一天,路漫漫其修远兮. --WZY 一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表 ...
- Mybatis的一对一查询以及延迟加载
一对一的关联查询: 使用业务扩展类 使用ResultMap 表如下 create table student(sid int(11) primary key not null, sname varch ...
- SAP 电商云 Spartacus UI 4.1 版本的延迟加载技术介绍
延迟加载,也称为代码拆分,可让您将 JavaScript 代码分成多个块. 结果是当用户访问第一页时,您不必加载完整应用程序的所有 JavaScript. 相反,只加载给定页面所需的块. 在浏览店面时 ...
- SAP Spartacus 的延迟加载 Lazy load 设计原理
官方链接 延迟加载,也称为代码拆分,可让您将 JavaScript 代码分成多个块. 结果是当用户访问第一页时,您不必加载完整应用程序的所有 JavaScript. 相反,只加载给定页面所需的块. 在 ...
- jquery 延迟加载代码_延迟加载是一种代码气味
jquery 延迟加载代码 您见过那些具有许多属性的巨大物体吗? 这些域对象由于不希望从数据库检索太多信息而在其中使用延迟加载? 我敢打赌你有这种令人怀疑的快乐. 今天,我想与您分享我对它们的印象- ...
- web.xml.jsf_使用JSF 2.2功能来开发可滚动,可延迟加载的Ajax数据表
web.xml.jsf 这次,我想与您分享我最近从JSF 2.2功能中学到的知识. 为此,我决定创建一个简单的ajax,可滚动,延迟加载的数据表. 请注意, 绝不这是相当大的库如Primefaces ...
- 延迟加载是一种代码气味
您见过那些具有许多属性的巨大物体吗? 这些域对象由于不希望从数据库检索太多信息而在其中使用延迟加载? 我敢打赌你有这种令人怀疑的快乐. 今天,我想与大家分享我对它们的印象- 使用延迟加载应该被视为一种 ...
最新文章
- php 批量导出excel文件,PHPEXCEL批量导出
- python解析雷达数据_【学习笔记】使用python带时间戳提取rosbag中的图像和雷达数据...
- pypypy python_聊聊Python中的pypy
- 1035. 插入与归并(25)
- mysql数据库提示2005_Mysql数据库从本地导出 服务器上导入时报 ERROR 2005 HY000 Unknown MySQL ser...
- 让UpdatePanel支持文件上传(4):数据传输与解析机制
- IoT -- (二) 物联网传感器介绍
- HDU 5938 2016CCPC杭州 F: Four Operations
- 对象的引用传递 ——面向对象3
- java计算机毕业设计网上书店进销存管理系统源码+数据库+系统+lw文档+mybatis+运行部署
- 机器视觉硬件之工业相机(一)
- python print()什么意思_python print用法是什么
- 使用backdrop-filter部分场景的替代效果
- Sprite和Texture的区别
- 微信群控系统制作系列一——java模拟登录网页版微信
- html图片左侧留白,HTML+CSS入门 如何解决图片跨域导致的截图空白
- Android常见页面布局
- 第四章 DirectX 渲染流水线(上)
- Harbor安装(待补充)
- Ogre3D 1.8.1 Android移植