2008-08-30 114 views
68

什么是延迟加载?什么是延迟加载?

[编辑看完几个答案后] 为什么人们经常使用这个术语?假设你只是使用一个ASP/ADO记录集并将其与数据或ADO.NET数据源一起加载到一个GridView中。

我想我应该问为什么人们使用术语懒加载,什么“其他”类型是他们?

回答

180

它被称为延迟加载,因为就像一个懒惰的人,你正在推迟你不想做的事情。与之相反的是Eager Loading,在你需要它之​​前很早就加载了一些东西。

如果你很好奇为什么人们可能会使用延迟加载,那么考虑一个需要一段LOOOOONG时间才能启动的应用程序。这个应用程序可能会进行大量的热切加载......从磁盘加载内容,进行计算以及在不需要的时间之前进行计算。

将此与延迟加载比较,应用程序启动速度会快得多,但是当您第一次需要做某些需要长时间运行的负载时,第一次加载时可能会稍微暂停。因此,通过延迟加载,您可以在整个运行应用程序的过程中分摊加载时间......并且实际上可以节省加载用户可能从不打算使用的内容。

+8

很好的解释。 – Christian 2011-06-16 10:10:37

+16

+1与“渴望加载” – 2011-09-14 19:00:11

35

延迟加载是一种编程实践中,你只能负荷或当你第一次需要初始化的对象。这可能会给您带来巨大的性能提升,尤其是在应用程序中有很多组件的情况下。

像往常一样,Wikipedia有更多的细节。

5

下面是一些实际的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 

基本上,我有这代表了我们的库存中的项目的项目类。我们拥有的物品总数是我们拥有的数量加上我们从各种来源借入的所有物品的总和。这些数字都存储在我们的数据库中,直到实际请求总数才计算出来是毫无意义的(因为经常使用项目而没有请求总数)。

因此,总属性检查_total字段是否存在。如果没有,则属性代码查询数据库并计算它,然后将该值存储在_total字段中,以便在下次请求时不需要重新计算它。

6

术语惰性加载通常用在讨论对象关系映射器时。如果您直接使用ADO.NET,则始终会进行急切的加载(即它总是加载您指定的内容)。

像nHibernate这样的OR映射程序支持返回代理对象,只有在访问数据时才会使用正确的数据“填充”。这样你只加载你真正使用的数据。当您指定可以从数据库加载的对象之间的很多关系时,这是一个有用的功能,您不希望OR映射器加载所有相关对象以及与相关对象相关的对象等。这可能会导致您的整个数据库被加载。

这个问题也可以通过您的对象模型的carefull设计来防止。 (使用聚合和只加载像在域驱动设计中的聚合根是一种避免使用延迟加载的方法)。

延迟加载会导致或映射器执行大量小型数据库访问,而不是检索您需要的所有数据。这也可能导致性能问题。

3

是一种设计模式。

延迟加载:直到代码需要由特定对象完成一些操作,对象不会被初始化,并且一旦它被初始化,它不会重新初始化对象,而是使用先前初始化的对象。

这使您的代码更有效率,并帮助管理内存使用情况。延迟加载的

应用实例:

鬼 延迟初始化 值保持

4

延迟加载:你不东西,你可能不需要浪费时间(也不是你的内存)。然后,当你需要它时,需要更长的时间,但那很好。

生活中的例子:不是实际学习法语短语手册,而是根据需要一次学习一个短语。这是什么意思?如果你只想在法国待上一段时间(即,你不需要很多短语),或者你需要很快离开。如果你在那里呆了两年,或者你有很长的时间去学习,那么学习整个短语手册可能会更有效率(急切加载)。

[由Atom as taught in gang terms by Venus on WKRP启发。]

4

延迟加载数据库中经常用来指的精选仅在需要时所需的信息的装载部分的概念的术语。

I.e.假设你需要有一个包含多个表的连接的记录。如果你一次提取所有数据,比只读取主表格要花费更多的时间。使用延迟加载时,只有在需要时才会提取其余的信息。所以在某些情况下它实际上是“高效加载”。

其他类型的“加载”的是:

  1. 预先加载 - 载入所有连接的表一次。
1

Lazy<T>现在是C#4.0的一部分 - 有上MSDN一个漂亮的网页,其中解释了这一概念。

1

延迟加载的示例将是一个网格或表,其中包含大量网页上的数据,以查看应用程序只加载用户浏览器视点大小的时间。当他们向下滚动以查看更多内容或数据时,更多数据将在此时加载到视图中。

通过ajax或jQuery,它正变得越来越普遍的视觉/交互设计模式。

而且如上所述,相反的是Eager Loading,您不会考虑客户,因此可能会有性能问题。

10

延迟加载是一个概念,我们将对象单元的加载延迟到需要它的位置。用简单的话来说明需求对象加载而不是不必要地加载对象。例如,如果您有一个“客户”类具有“订单”对象汇总。因此,您希望加载客户数据,但希望延迟的订单对象直到您的应用程序需要它。

下面是一个youtube视频,演示如何使用延迟加载,如何实现延迟加载以及相同的优缺点。

http://www.youtube.com/watch?v=2SrfdAkwmFo

2

一些延迟加载的优点:

  1. 最大限度地减少了应用程序启动的时间。
  2. 由于按需加载,应用程序消耗较少的内存。
  3. 避免了不必要的服务器请求。