Welcome

首页 / 软件开发 / .NET编程技术 / 性能优化总结(二):聚合SQL

性能优化总结(二):聚合SQL2012-05-22 博客园 BloodyAngel本篇主要讲如何使用一句较复杂的SQL来加载整个聚合对象,以达到最小化数据库连接次数。主要是解释其中的原理。

LazyLoad及其缺点

相信越来越多的人已经开始使用富领域对象进行领域/业务层的实现了。而目前主流的数据库依然还是关系型的。这中间的转换,我们 叫它ORM。ORM的设计中,有一个常用的模式叫作“延迟加载(LazyLoad)”。基设计思想大致上是说,不要把所有的数据都加载进内存, 而是等到真正要使用数据的时候,再把它加载进内存。

例如以下这个聚合对象:

(为了和后面的代码保持一致,这里面使用的是GIX4项目中真实的类,可能会带有一些领域特性,望读者见谅。后面可能会继续使用此 例,现大致对其进行解释:其中,PBSType表示一套PBS模板/类型,一套模板由许多PBS组成。PBS是Project Breakdown Structure的简称 ,用于对某一个项目进行分解,这里面一个PBS对象的实例其实只是结构中的一项,应该在后面加上Item,不过公司的人都习惯了,所以就 延用这个命名。每个PBS有许多属性(PBSProperty),每个属性又有许多可选值(PBSPropertyOptionalValue)。)

这个对象,在使用了LazyLoad对PBSType进行设计之后,客户程序使用代码如下:

var type = PBSType.Get(id);
//do something
//...

//lazily load a pbs list. data access occurs.
PBSList pbsList = type.PBSs;

//read from memory
var pbsListCount = type.PBSs.Count;

这里一共产生了两次数据访问:获取PBSType对象、获取所有在该PBS模板下的PBS对象列表。此例说明了对集合对象使用LazyLoad,还 有一种比较常用的LazyLoad:对引用对象的LazyLoad。如下例:

文章对象引用一个用户对象来表示其作者。这个外键引用的关系,常常也被设计为LazyLoad。