0


我目前正在阅读一本关于网站编程的书,作者提到他将编写 DLL 对象以使用延迟加载模式。我认为从概念上讲我有点理解延迟加载模式,但我不确定我是否理解它在作者实现它的方式中的用处

顺便说一句 - 这里我不是在问一般延迟加载模式的有用性,而是在这本特定的书实现它的方式上是否有用:


1) 无论如何,当创建 DLL 对象时,会执行一个 DB 查询(通过 DAL),它从各个列中检索数据并用它填充我们的 DLL 对象的属性。由于其中一个字段(称为“ L ”)可能包含大量文本,因此作者决定仅在第一次读取该属性时检索该字段。


A)在我们的情况下,我们通过应用延迟加载模式究竟获得了什么?只是更少的内存使用?


B)但另一方面,作者实现延迟加载模式的方式不会导致 CPU 做更多的工作,从而导致更长的时间来完成,因为如果 L 是与其他字段分开检索的,那么这将需要我们的应用程序对 Sql Server 进行额外调用以检索“ L ”,而在没有延迟加载模式的情况下,只需要对 Sql Server 进行一次调用,因为我们会一次获取所有字段?!

顺便说一句——我意识到延迟加载模式在检索特定数据需要大量计算的情况下可能非常有用,但在上面的示例中并非如此


谢谢

4

3 回答 3

2

如果可以在没有 L 字段的情况下使用 DLL 对象(大多数情况下),这是有意义的。如果是这种情况,您的程序可以在等待 L 加载时使用可用数据。如果总是需要 L,那么该模式只会增加复杂性。我认为它不会显着减慢速度,特别是如果加载 L 比其他任何东西都需要更多时间。但这只是一个猜测。使用延迟加载编写两者,然后查看哪个更好。

于 2009-07-18T20:02:18.113 回答
1

我认为这在应用于正确的列时非常有用。例如,假设您的数据库中有一个表Customers,并且在该表中您有一个 column CustomerPublicProfile,它是一个可能非常大的文本列。

Customers.aspx如果您有一个显示客户列表(但不是列)的屏幕(我们称之为CustomerPublicProfile),那么您应该尽量避免填充该列。

例如,如果您的Customers.aspx页面一次显示 50 位客户,则您不必CustomerPublicProfilecolumn为每个客户获取。如果用户决定深入了解特定客户,那么您将去获取该CustomerPublicProfile列。

关于 B,是的,这确实会进行N次额外调用,其中N是用户决定深入研究的客户数量。但这样做的好处是,您一开始就在跳过列时节省了很多额外的不必要的开销。具体来说,您避免获取列的MNCustomerPublicProfile,其中M是在Customers.aspx页面上检索到的客户数。

如果在您的场景中M的值接近N则不值得。但在我描述的情况下,M通常比N大得多,所以这是有道理的。

赛义德·易卜拉欣·哈希米

于 2009-07-18T20:08:35.233 回答
1

我最近遇到了这样的情况,我在数据库中存储了大型二进制对象。我当然不希望每次初始化时都将这些加载到 DLL 对象中,尤其是当对象是集合的一部分时。因此,在某些情况下延迟加载字段是有意义的。但是,我不认为您可以遵循任何一般规则 - 您知道您的数据以及如何访问它。如果您认为一次访问数据库并使用更多内存更有效,那么您应该这样做。

于 2009-07-18T20:16:12.767 回答