解决实体载入的性能问题 - Lazy Load,延迟载入
2006-07-30 12:01
281 查看
因为AR把数据库中的外键关系全部采用对象间的聚合关系表现了出来,例如:
实体Blog对象中会包含一个IList Posts的属性,以表示他们之间的关系。这样,只要通过 Blog blog = Blog.fine(id); 得到一个Blog实体,内存中就会同样生成与其相关的Post对象。
但是,在一个大的系统中,这种对象间的关系会非常复杂 (Blog对象可能还会和Community之间存在关系,还可能和PostCategory存在关系......)。于是,得到一个Blog对象的同时,可能得到其他与之相关的N多个对象 (想想你的数据库设计,不要小看这个N)。但是这些象都可能是暂时不需要的,但仍然被载入内存,这将严重影响系统的性能。
对与这个问题,可以使用"Lazy Load"---延迟载入。为对象间关系的属性打上 Lazy的标签。这样,当你new Blog的时候,不会把于其相关的Post,Community......载入内存。只有当你真正需要那些对象时,比如,进行 Blog.Posts 调用时,框架会自动为我们从数据库中得到我们所需要的东西。
例子如下:
在Blog实体中,存在一个Posts的属性,表明该Blog发表的所有Post,先看看在Blog里是怎样声明这个东西的:
这样的话,每生成一个Blog对象,就会把和他相关的Post对象全部载入,现在我们来为他打上Lazy Load的标签,很简单,只需要在特性中指明“Lazy=true”
OK。现在这个Posts属性已经具备了延迟载入的能力。我们来看一下他的运行过程怎么样的。
请注意 new SessionScope() 。因为在执行int postCount = blog.Posts.Count 的时候才会执行从数据库中载入相应数据的步骤。所以,在此时必须存在一个NHibernate的ISession,不然Castle框架将无法从库载入数据,从而引发一个"NHibernate.LazyInitializationException : Failed to lazily initialize a collection - no session"异常。因此,再得到blog实体后,为了进行延迟载入,我们必须把这个Session保持下来,于是有了这个SessionScope
实体Blog对象中会包含一个IList Posts的属性,以表示他们之间的关系。这样,只要通过 Blog blog = Blog.fine(id); 得到一个Blog实体,内存中就会同样生成与其相关的Post对象。
但是,在一个大的系统中,这种对象间的关系会非常复杂 (Blog对象可能还会和Community之间存在关系,还可能和PostCategory存在关系......)。于是,得到一个Blog对象的同时,可能得到其他与之相关的N多个对象 (想想你的数据库设计,不要小看这个N)。但是这些象都可能是暂时不需要的,但仍然被载入内存,这将严重影响系统的性能。
对与这个问题,可以使用"Lazy Load"---延迟载入。为对象间关系的属性打上 Lazy的标签。这样,当你new Blog的时候,不会把于其相关的Post,Community......载入内存。只有当你真正需要那些对象时,比如,进行 Blog.Posts 调用时,框架会自动为我们从数据库中得到我们所需要的东西。
例子如下:
在Blog实体中,存在一个Posts的属性,表明该Blog发表的所有Post,先看看在Blog里是怎样声明这个东西的:
[HasMany(typeof(Post), Table="Post", ColumnKey="BlogId")] public System.Collections.IList Posts { get { returnthis.posts; } set { this.posts = value; } }
这样的话,每生成一个Blog对象,就会把和他相关的Post对象全部载入,现在我们来为他打上Lazy Load的标签,很简单,只需要在特性中指明“Lazy=true”
[HasMany(typeof(Post), Table="Post", ColumnKey="BlogId",Lazy=true)]
OK。现在这个Posts属性已经具备了延迟载入的能力。我们来看一下他的运行过程怎么样的。
using(new SessionScope()) { Blog blog = Blog.Find(96); //通过Blog类的静态方法得到一个Blog实体 //此时,blog对象里面的Posts属性并没有把相应的Post载入内存 string blogName = blog.BlogName; //到下面这一步,AR框架才会为我们从库中把相应的Post载入,从而达到延迟载入 int postCount = blog.Posts.Count; }
请注意 new SessionScope() 。因为在执行int postCount = blog.Posts.Count 的时候才会执行从数据库中载入相应数据的步骤。所以,在此时必须存在一个NHibernate的ISession,不然Castle框架将无法从库载入数据,从而引发一个"NHibernate.LazyInitializationException : Failed to lazily initialize a collection - no session"异常。因此,再得到blog实体后,为了进行延迟载入,我们必须把这个Session保持下来,于是有了这个SessionScope
相关文章推荐
- [转] 解决实体载入的性能问题 - Lazy Load,延迟载入
- 延迟加载解决offset过大导致的分页性能问题
- Hibernate中的session和load延迟载入矛盾问题,怎样解决?
- iOS开发那些事--性能优化–内存泄露问题的解决
- 怎样解决无法载入mysql扩展检查php配置问题?验证码无法识别问题?
- 使用Hibernate要从以下几个方面入手解决性能问题.
- 关于载入地形出错的问题解决方法
- SQL2005开发版安装中“性能监视器计数器要求(错误)”和“com+目录问题警告处理”问题的解决
- [MySQL] 号称永久解决了复制延迟问题的并行复制,MySQL5.7
- 性能问题解决记
- 解决IOS点击延迟跳转的问题
- 推荐Sql server一些常见性能问题的解决方法
- 解决photoshop CS3运行延迟问题
- Hibernate延迟加载以及利用Spring事务完美解决延迟加载问题
- Redis 常见的性能问题和解决方法
- J2EE系统很慢,如何解决性能问题
- 解决Java/MySQL性能问题的思路
- 数据延迟问题导致页面即时刷新数据不全问题如何从业务中解决
- 网站速度很慢问题解决的方法(TOMCAT性能调整)
- MySQL主从数据库同步延迟问题解决