什么是延迟加载?
[阅读一些答案后进行编辑]人们为什么经常使用此术语?
假设您仅使用ASP / ADO记录集,并使用数据或ADO.NET数据源将其加载到gridview。
我想我应该问为什么人们使用术语“延迟加载”,它们是什么“其他”类型?
Answers:
之所以称为“延迟加载”,是因为像一个懒惰的人一样,您推迟执行不想做的事情。与之相反的是“急切加载”,您可以在需要时就立即加载某些东西。
如果您好奇为什么人们可能会使用延迟加载,请考虑一个需要很长时间才能启动的应用程序。这个应用程序可能正在做很多急切的工作……从磁盘上装载东西,然后进行计算等等。
将其与延迟加载进行比较,应用程序将启动得更快,但是,当您第一次需要执行需要长时间运行的加载的操作时,首次加载时可能会有一点暂停。因此,通过延迟加载,您可以在运行应用程序的整个过程中分摊加载时间……实际上,您可以避免加载用户永远不会使用的内容。
延迟加载是一个概念,其中我们将对象单元的加载延迟到需要的位置。简单说说按需加载对象,而不是不必要地加载对象。例如,如果您有一个“客户”类,其中包含“订单”对象。因此,您希望加载客户数据,但是要延迟订单对象,直到应用程序需要它为止。
以下是一个youtube视频,该视频演示了如何使用延迟加载,如何实现延迟加载及其优点和缺点。
维基百科的“定义延迟加载”是一种设计模式,通常在计算机编程中用于将对象的初始化推迟到需要它的时候进行。...
在谈论对象关系映射器时,通常使用术语惰性加载。如果直接使用ADO.NET,您总是会急于加载(即,它始终会加载您指定的内容)。
像nHibernate这样的OR映射器支持返回代理对象,只有在访问数据时,这些代理对象才会用正确的数据“填充”。这样,您只需加载您实际使用的数据。当您指定可以从数据库中加载的对象之间有很多关系,而您不希望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字段中,以便下次请求时无需重新计算它。
延迟加载:您不会浪费时间(也不会浪费您的时间)来使用可能不需要的东西。然后,当您需要它时,它会花费更长的时间,但这很好。
生活中的例子:您不需要实际学习法语短语手册,而是一次学习一个短语。什么时候有意义?如果您只是短暂待在法国(即您不需要很多用语),或者您需要很快离开。如果您在这里呆了两年,并且/或者您有很长的学习时间,那么提前学习整个短语集(渴望加载)可能会更有效率。
[受到金星在WKRP上以帮派术语讲授的原子的启发。]
是一种设计模式。
延迟加载:直到您的代码需要由特定对象完成某些操作,对象才会被初始化,并且一旦初始化,它就不会重新初始化该对象,而是使用先前初始化的对象。
这使您的代码效率更高,并有助于管理内存使用情况。
延迟加载的示例应用程序:
Ghost延迟初始化值持有者
延迟加载的一些优点:
根据geeksforgeeks的说法,延迟加载是一种软件设计模式,其中,仅在实际需要时才进行对象的初始化,而不是在保持使用简便性和提高性能的前提下进行初始化。