什么是懒惰加载?
[阅读几个答案后编辑]为什么人们经常使用这个术语?
假设您只使用ASP/ADO记录集并将其加载数据或ADO.NET数据源以用于gridview.
我想我应该问为什么人们使用"懒惰加载"一词,"其他"类型是什么?
它被称为延迟加载,因为,就像一个懒惰的人,你正在推迟做你不想做的事情.相反的是Eager Loading,您可以在需要它之前立即加载.
如果您好奇为什么人们可能会使用延迟加载,请考虑一个需要LOOOOONG时间才能启动的应用程序.这个应用程序可能正在进行大量的热切加载...从磁盘加载东西,并在需要之前做很多事情.
将此与延迟加载相比较,应用程序启动速度会快得多,但是当您第一次需要执行需要长时间运行负载的操作时,第一次加载时可能会有轻微的暂停.因此,使用延迟加载,您将在运行应用程序的整个过程中分摊加载时间......实际上,您可以节省加载用户可能永远不会使用的内容.
延迟加载是一种编程实践,您只需在第一次需要时加载或初始化对象.这可能会为您带来巨大的性能提升,特别是如果您的应用程序中有很多组件.
像往常一样,维基百科有更多细节.
延迟加载是一个概念,我们将对象单元的加载延迟到我们需要它的位置.在需求对象加载时加入简单的单词而不是不必要地加载对象.例如,如果您有一个"客户"类,其中聚合了"订单"对象.因此,您希望加载客户数据,但是您希望延迟订单对象,直到您的应用程序需要它为止.
下面是一个YouTube视频,演示了如何使用延迟加载,如何实现延迟加载以及相同的优缺点.
http://www.youtube.com/watch?v=2SrfdAkwmFo
维基百科的定义延迟加载是计算机编程中常用的设计模式,用于将对象的初始化推迟到需要它的点....
http://en.wikipedia.org/wiki/Lazy%20loading
在谈论对象关系映射器时,通常使用术语延迟加载.如果您直接使用ADO.NET,您总是会得到热切的加载(即它总是加载您指定的内容).
像nHibernate这样的OR-mappers支持返回代理对象,只有在访问数据时才能使用正确的数据"填充"它们.这样您只需加载您真正使用的数据.当您在可以从数据库加载的对象之间指定很多关系时,这是一个非常有用的功能,您不希望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字段中,以便下次请求时不需要重新计算它.