【发布时间】:2010-09-07 08:50:05
【问题描述】:
什么是延迟加载?
[阅读几个答案后编辑] 为什么人们如此频繁地使用这个词?
假设您只使用一个 ASP/ADO 记录集,并为它加载数据或用于网格视图的 ADO.NET 数据源。
我想我应该问为什么人们使用“延迟加载”这个词,他们的“其他”类型是什么?
【问题讨论】:
什么是延迟加载?
[阅读几个答案后编辑] 为什么人们如此频繁地使用这个词?
假设您只使用一个 ASP/ADO 记录集,并为它加载数据或用于网格视图的 ADO.NET 数据源。
我想我应该问为什么人们使用“延迟加载”这个词,他们的“其他”类型是什么?
【问题讨论】:
这被称为延迟加载,因为就像一个懒惰的人一样,你正在推迟做一些你不想做的事情。与之相反的是急切加载,您可以在需要之前就立即加载。
如果您想知道人们为什么会使用延迟加载,请考虑一个需要很长时间才能启动的应用程序。这个应用程序可能正在执行大量急切加载...从磁盘加载内容,并在需要它之前进行计算等等。
将此与延迟加载相比,应用程序启动速度会快得多,但是当您第一次需要执行需要长时间运行负载的操作时,第一次加载时可能会有轻微的暂停。因此,通过延迟加载,您可以在整个运行应用程序的过程中分摊加载时间......实际上您可以节省加载用户可能永远不会使用的东西。
【讨论】:
延迟加载是一种编程实践,您只在第一次需要对象时才加载或初始化它。这可能会给您带来巨大的性能提升,尤其是当您的应用程序中有很多组件时。
像往常一样,Wikipedia 有更多详细信息。
【讨论】:
延迟加载是一个概念,我们将对象单元的加载延迟到我们需要它的位置。简单地说就是按需加载对象,而不是不必要地加载对象。例如,如果您有一个聚合了“订单”对象的“客户”类。因此,您希望加载客户数据,但您希望延迟订单对象,直到您的应用程序需要它。
下面是一个 youtube 视频,演示了如何使用延迟加载,我们如何实现延迟加载以及它们的优缺点。
【讨论】:
维基百科的定义 延迟加载是计算机编程中常用的一种设计模式,用于将对象的初始化推迟到需要它的时候。 ...
【讨论】:
在谈论对象关系映射器时,通常使用术语延迟加载。如果您直接使用 ADO.NET,您总是会得到预先加载(即它总是加载您指定的内容)。
像 nHibernate 这样的 OR-mapper 支持返回代理对象,这些代理对象只有在您访问数据时才会“填充”正确的数据。这样你只加载你真正使用的数据。当您指定可以从数据库加载的对象之间的大量关系时,这是一个有用的功能,您不希望 OR-mapper 加载所有相关对象以及与相关对象相关的对象等等。这可能会导致您的整个数据库被加载。
这个问题也可以通过仔细设计你的对象模型来避免。 (使用聚合并只加载聚合根,就像在域驱动设计中一样,是一种在不使用延迟加载的情况下解决此问题的方法)。
延迟加载会导致 or 映射器执行大量小型数据库访问,而不是一次检索您需要的所有数据。这也可能导致性能问题。
【讨论】:
这是我编写的一些实际 Python 代码的示例:
class Item(Model):
...
@property
def total(self):
if not hasattr(self, "_total"):
self._total = self.quantity \
+ sum(bi.quantity for bi in self.borroweditem_set.all())
return self._total
基本上,我有一个 Item 类,它代表我们库存中的一个项目。我们拥有的物品总数是我们拥有的数量加上我们从各种来源借来的所有物品的总和。这些数字都存储在我们的数据库中,在实际请求总数之前计算它是没有意义的(因为通常会在没有请求总数的情况下使用项目)。
所以 total 属性检查 _total 字段是否存在。如果没有,则属性代码查询数据库并计算它,然后将值存储在 _total 字段中,以便下次请求时无需重新计算。
【讨论】:
延迟加载:您不会将时间(或记忆)浪费在您可能不需要的东西上。然后当你需要它时,它需要更长的时间,但这很好。
生活中的例子:您无需实际学习法语短语手册,而是根据需要一次学习一个短语。这什么时候有意义?如果您只打算在法国呆很短的时间(即,您不需要很多短语)或者您需要很快离开。如果您在那里待了两年并且/或者您有很长的时间要学习,那么预先学习整个短语手册(急切地加载)可能会更有效率。
【讨论】:
延迟加载是数据库中经常使用的术语,指的是仅在需要时才加载所需信息的一部分的概念。
即假设您需要有一个连接多个表的记录。如果您一次获取所有内容,则比仅获取主表所需的时间更长。使用延迟加载将仅在需要时获取其余信息。所以在某些场景下它实际上是“高效加载”。
其他类型的“加载”是:
【讨论】:
是一种设计模式。
延迟加载:在您的代码需要由特定对象完成某些操作之前,对象不会被初始化,并且一旦被初始化,它不会重新初始化对象,而是使用之前初始化的对象。
这使您的代码更加高效,并有助于管理内存使用情况。
延迟加载的示例应用:
幽灵 延迟初始化 价值持有者
【讨论】:
延迟加载的一些优点:
【讨论】:
延迟加载的一个示例是在网页上包含大量数据的网格或表格,以查看应用程序仅加载当时用户浏览器视点大小的位置。当他们向下滚动以查看更多内容或数据时,此时会加载更多数据。
通过 ajax 或 jQuery,这正成为一种常见的视觉/交互设计模式。
如上所述,相反的是急切加载,您不考虑客户端,因此可能会影响性能。
【讨论】:
Lazy<T> 现在是 c# 4.0 的一部分 - MSDN 上有一个很好的页面解释了这个概念。
【讨论】:
根据 geeksforgeeks 的说法,延迟加载是一种软件设计模式,其中对象的初始化仅在实际需要时才进行,而不是在之前进行,以保持使用的简单性并提高性能。
【讨论】: