知识卡片

延迟加载的使用时机判断:只对需要额外数据库访问的域使用

普通读书笔记卡

内容

判断该不该给某个域上延迟加载,核心看两点:加载这个对象本身需要从数据库读多少数据、以及需要几次数据库调用。对那些和对象主体数据存在同一行里的普通域,通常没必要延迟加载——反正都要访问这一行,顺带把这些域也读出来基本不会增加额外开销,哪怕这个域数据量较大(比如一个序列化LOB字段)也是如此,因为它依然只需要这一次调用就能取到。真正该考虑延迟加载的,是那些需要发起额外数据库访问才能拿到的域或关联对象——只有这种情况下延迟加载才能真正省下一次不必要的调用。从性能视角看,更常见的更优做法反而是”一次调用取回所有需要的数据、随取随用”,尤其当这些数据对应同一次用户界面交互时;延迟加载最值得出手的时机,是那些需要额外调用、而且主对象被使用时这份额外数据往往根本用不上的场景。同时也要认识到,延迟加载会切实增加编程复杂度(虚代理的相等性问题、重影的继承处理等),因此作者的态度是:只有确实判断出需要它的时候才用,不做默认选项。

参考来源

- 位置:《企业应用架构模式》第二部分"模式"之"第11章 对象-关系行为模式"之"11.3.2 使用时机"(源文件:_epub-src/OEBPS/Text/000099.html) - 结论依据:原文说明"什么时候使用延迟加载完全取决于加载一个对象时需要从数据库读取多少数据和数据库调用的次数。通常没必要对和对象的剩余部分处于同一行中的域使用延迟加载……只有在域需要另外的数据库访问时才考虑使用延迟加载……使用延迟加载的确在一定程度增加了编程的复杂性,因此,当我确实认为需要它的时候才使用延迟加载",直接支撑本卡结论。 - 原始内容:使用延迟加载的最佳时机是,需要额外的调用,并且当使用主对象时所调用的数据没有用到的时候。