Lazy Load vs Immediately Load?

LazyLoad是在实体实例加载中一种可选的策略,在Hibernate2中支持引用的LazyLoad,在Hibernate3中更支持任意类型属性级的LazyLoad。
大概评估了一下,LazyLoad有以下好处:
1.提高运行时的响应度。执行三个SQL语句显然比执行一个SQL语句快。
2.节省内存。一次性加载全部的依赖肯定会耗费更多的内存。
3.不用担心循环引用。因为互相引用的两种不同的实体是在不同的时期加载的。
4.对特殊的BLOB字段(例如较大的图片)似乎必须采用LazyLoad。
看起来似乎LazyLoad是一个持久层框架必备的功能。况且实现LazyLoad是件非常容易的事情。
但是,思考再三,最终全面放弃LazyLoad。理由是:
1.数据库连接的成本高于数据库执行的成本,采用LazyLoad虽然会减少数据库连接时间,但是却增加了连接的次数,导致最终数据库成本增高。
2.可以强制BLOB字段采用分割映射----即将键与BLOB单独映射到另外一个实体中。当然,是采用两张表还是一张表全凭开发者自己选择。如果是映射到同一张表,则该字段必须为可空(因为这个字段的读写显然与其它字段的读写不在同一个SQL语句中)。这样可以带来一些额外的好处。在不需要BLOB属性的时候完全不用考虑这个属性的存在。
3.关于内存的占用,通过实际运行的测算,不会比LazyLoad占用的内存多过一倍。如果某一次Load出的实例为10000个,那么它所依赖的其它实例则一定不会超过10000行。因为每次依赖的过程是一个循环递减的过程。
4.在Kanas.net中需要在应用上下文中保存实体的加载状态,以满足DataSet的要求。对部分加载的实体是通过已加载的约束与请求的约束进行比对,通过逻辑运算进行优化,以尽量减少从数据库返回的行数。

posted @ 2005-08-10 02:40  双鱼座  阅读(2739)  评论(16编辑  收藏  举报