网站首页博客首页 ┆欢迎光临 Bos开发者网络 登录注册帮助
我的企业架构视点
日志

应用模式分析系列三(Lazy Load)

延迟加载/惰性加载(Lazy Load)
        一个对象,它并未包含所有数据,但是知道如何获取这些数据。
        上述是定义,但我觉得这个定义并未体现出LazyLoad的精华,因为我们真正需要的不是它知道如何取得,而是能够根据需要取得,从而根据实际情况来优化性能或内存。
        刚进EAS的时候正处于LazyLoad应用高峰期,整天慢耳都是“惰性加载”几个字,其实惰性加载的实现方式很多,常见的有:
        延迟初始化(Lazy Initialization):说白了就是一个对象一开始就是空对象(除了对象标识符就是赤裸裸的空了),获取其任何数据都先判断是否为空,不为空就单独获取。
        虚代理(Virtual Proxy):通过一个代理对象对其进行包装,当调用代理对象的方法时才会真正加载数据。这和WEB通过Proxy加载图片类似。
        值保持器(ValueHolder):也就是个值对象,这个翻译感觉太直白了。
        重影(ghost):这个和LazyInitialization类似,不同之处在于它一开始除了ID都是NULL,但是一旦有方法被访问就会加载其他属性。
        
        LazyLoad的优缺点技术人员都应该比较清楚,我就说说缺点:
            LazyInitialization和Ghost都会有加大数据库访问次数的问题。
            ValueHolder和Proxy则存在强类型转换的问题。
        具体处理方案则需要开发人员自行选择了,我个人比较推崇Ghost。
    
       但是Ghost也会存在问题,如果是一个大对象的访问,那么在第一次访问其方法时就可能出现性能问题,从而未达到LazyLoad的本来目的。幸好还有一种变通,通过对对象属性进行分类,可以将第一次访问加载变更为根据特定方法加载一批特定属性的方式。比如对对象中的图片就可以在运行时放到需要显示图片时单独加载。
        在EAS元数据中如果针对属性增加Zorder参数,对属性进行分层,再通过层次与方法的绑定,是否可以做到特定方法加载特定层次的数据呢?默认行为可以是Ghost的默认方式。
        复杂度是大大增加了,但是对性能应该还是有益的,就是要看实现的信价比了。
已经公开 2007年9月14日 16:41 作者: 胡锦敏

评论

avatar 
信价比 => 性价比
 
我认为延迟加载本身的思想就有问题,无论那种延迟加载技术,都面临这样的问题:
延迟加载都是在利用程序首次访问属性时,再去加载数据,那么程序有两种选择,1仅加载你需要的数据,2加载所有未加载的数据。
但是,你怎么预测程序下一步该访问什么呢?所以很可能使用1方案时,程序不断的发送SQL,而2方案可能浪费的读取数据。当然,你可能会设计一个神奇的预测型延迟加载技术。
 
我认为,以单据的附件为例,就根本不应该将附件作为延迟加载的数据,而是作为外部关联的数据。这样你很明确我需要读什么。
2007-10-25 18:15
 
请登录后再发表评论以赚取更多积分

About 胡锦敏

计算机应用专业博士,留荷博士后,工作流专家,长期从事企业建模、工作流和电子商务等相关的研究工作,02年加盟金蝶从事EAS的总体设计工作,现为金蝶EAS资深架构师。同时还主导国家863企业信息化技术相关课题的研究工作,研究范围包括MDA,SOA、应用集成、企业间业务协同等。