码迷,mamicode.com
首页 > Web开发 > 详细

NHibernate系列文章二十一:延迟加载

时间:2016-07-23 00:31:55      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:

摘要

NHibernate的延迟加载机制是很重要的内容。通过关系映射将数据库表之间的关系映射成对象之间的关系,如果没有延迟加载机制,从主表的一个对象的查询将直接查询出所有与该对象关联的其他对象,如果关联的对象上还有其他的关联对象,还要去查询其他的对象。如果这张“网”非常大,或者关联的数据库记录非常多的话,每次查询主表记录都要把整个数据库都查询一遍,这样效率会非常低下。为了解决这个问题产生了NHibernate延迟加载。对一些属性设置延迟加载,只在对象访问到这些属性的时候才去查询数据库,很大程度上提高了系统性能。

属性是否使用延迟加载在映射文件里设置lazy="true|false"来打开|关闭延迟加载。(NHibnerate 4.0默认是开启延迟加载,默认值是true,使用延迟加载)。 

程序演示

1、默认使用延迟加载的情况

假设数据库Customer表里有一条Id为2的记录,与之关联的Order表里有两条Order记录。

var customer = customerService.GetById(2);

执行此行代码得到的监控结果。

技术分享

监控结果显示,只查询了Customer表记录。

如果将程序改成下面这样:

1             var customer = customerService.GetById(2);
2             var orders = customer.Orders;
3             int orderCount = orders.Count;

再次运行程序,得到监控结果:

技术分享

在执行这句下面赋值语句的时候,才去执行Order表的查询。

int orderCount = orders.Count;

2、关闭延迟加载

修改Customer.hbm.xml文件。

    <set name="Orders" table="`Order`" cascade="all-delete-orphan" inverse="true" lazy="false">
      <key column="CustomerId"/>
      <one-to-many class="Order"/>
    </set>

执行同样的查询语句,得到监控结果。

技术分享

监控记录显示,在查询Customer的同时,还查询了Order记录。

只有在关联的属性记录数量不是很多的情况下才使用lazy="false",关掉延迟加载。

 

结语

NHibernate的延迟加载是NHibernate很重要的一个性能优化,NHibernate默认是开启延迟加载的,可以通过设置属性的lazy="false"强制关闭某一个属性的延迟加载。

 

NHibernate系列文章二十一:延迟加载

标签:

原文地址:http://www.cnblogs.com/uncle_danny/p/5657889.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!