`
sameseam
  • 浏览: 21763 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

万不得已不要使用ORM延迟加载(Lazy Loading)

 
阅读更多

延迟加载(Lazy Loading)是啥玩意儿?估计地球人都知道,它的意义在于只在需要的时候才去加载必要的数据,这样可以避免即时加载所带来的不必要的系统开销(教科书是这么说的)。另外,教科书中还举了个例子。例如某个User对象在加载时会同时读取其所关联的多个地址(Address)对象,对于需要对Address进行操作的应用来说,关联数据的自动加载机制非常有效。不过呢如果我们只想要获得User的性别(sex)属性,而不关心User的地址(Address)信息,那么加载Address的特性就显得多余,并且造成了极大的性能浪费。为了获得User的性别属性,我们可能还要同时从数据库中读取数条无用的地址数据,这导致了大量无谓的系统开销,因此延迟加载就这么闪亮登场,基本上目前绝大多数的ORM都具有延迟加载的特性。

好处如此多,为啥要慎用?


第一,延迟加载搞不好就容易导致N+1 select问题,性能反而不能保障

第二,延迟加载一般是在ORM中采用字节码增强方式来实现,这种方式处理后的对象往往会导致对象序列化失效,而在大型web应用中一般都会采用 独立的缓存架构,一但应用系统引入独立的缓存系统对应用数据对象进行缓存,采用延迟加载后的对象序列化将失效,导致缓存失败。

第三,ORM中的延迟加载将业务对象的加载关系搞得不清不楚,如果某天想换ORM,那么还得针对不同的ORM处理延迟加载关系,即使不还ORM后来人想理解加载关系也会很头疼。

第四,延迟加载目的是为了提高性能,减少系统消耗,但是目前硬件处理能力已经大大提高,对于这点系统消耗一般还是可以承受,即使说有性能问题,也可以通过增加廉价PC来均摊负载,提高性能。

第五,从另外一方面考虑,ORM需要承担的仅仅是O R M,和事务、缓存等特性一样,它们应该由其他更有资格的家伙来承担,不需要搞那么负载,否则对于以后的底层扩展,那可是一个艰巨的工作。


建议,没有必要不要使用ORM中延迟加载特性,除非你的系统性能实在是不行了,需要延迟加载来避免这类系统消耗,那时你再考虑使用。而即使你要使用延迟加载特性,也建议你考虑清楚,是否要增加独立的应用缓存等等,有时可能根本原因在于系统的设计问题。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lovingprince/archive/2009/12/28/5089823.aspx

chuan122345发表于2009年12月29日 8:40:44IP:举报
这类问题很普遍,最好的方法是ORM框架只做映射,不做关联,关联还是写程序手动控制,虽然麻烦,但是性能方面好控制,用ibatis吧。
分享到:
评论

相关推荐

    SqliteORM,一个很好的Sqlite ORM框架

    Sqlite ORM 是一个简单的C#类,对Sqlite的操作进行了封装,主要功能包括:表定义、生成,访问,更新等,其中,支持,多表的连接操作,语法类似Linq语法,使用非常方便,附加了使用说明文档。 例如,添加记录操作为...

    高效使用JavaEE ORM框架

    很多初学者对JDBC的复杂性望而却步,就简单认为使用ORM就会省时省力,结果恰恰相反,任何好的框架都是给专家准备的,任何急功近利试图偷懒的方法往往适得其反。要正确使用ORM还真不是一件简单的事情。本文仅简单整理...

    django框架使用orm实现批量更新数据的方法

    主要介绍了django框架使用orm实现批量更新数据的方法,结合实例形式简单分析了Django基于orm操作数据库更新数据的相关实现技巧,需要的朋友可以参考下

    qt开发的orm

    qt开发的orm库,开发例子及资料在整理中

    orm-fetch-dsl:使用 ORM 查询急切获取列的 DSL

    访问任何未明确预取的字段将导致 ORM 从数据库中延迟加载它。 为了防止这种延迟加载,必须预先指示 ORM 为每个查询获取哪些列。 Eager-fetch 配置可能会变得非常深(对于有很多连接的表)并且维护起来很麻烦,这...

    Python-TortoiseORM是python中易于使用的异步ORM

    Tortoise ORM 是 python 中易于使用的异步 ORM

    ormsql使用示例

    超级简单的android 数据库 ormsql使用示例,易懂易学

    JPA详解视频教程 第6讲 大数据字段映射与字段延迟加载.avi

    JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第6讲 大数据字段映射与字段延迟加载.avi

    Android ORM 数据库的使用

    Android Sqlite 数据库通过 ORM 的方式操作起来会方便很多,效率也会提升很多。本课程将会详细讲解 ORM 数据库框架的使用,提升 Sqlite 的操作和开发效率。

    ORM的简单介绍及相应ORM工具Hibernate的使用规则

    对象关系映射的概念,及相应Hibernate的使用规范,同时通过实例展示到底什么是对象关系映射。

    Elasticsearch​的ORM工具orm4es.zip

    orm4es是一个Elasticsearch的ORM工具,它可以生成简单的查询对象.它本身非常简单,也很容易使用;代码生成通过freemark完成,它会自动解析es index 的mapping设置,根据mapping生成与index对应的java Bean,使用生成...

    数据库动态加载匿名对象

    1 如果你使用过带有Linq的Orm 一定会对匿名对象有所了解 加载的对象必须是定义过的类; 2 直接用数据库的DataReader和DataTable处理对象又不方便; 3 定义一个新类 又只有很少的地方或一个地方使用; 4 也不想使用...

    ORM框架ORM框架ORM框架ORM框架

    能实现基本的数据库操作能实现基本的数据库操作

    ORM思想的深入学习ORM.zip

    这里面包括了Hibernate和MyBatis的实现ORM思想的原理,以及讲解了什么是ORM思想。仿照Hibernate自定义了一个简单的增删改查的ORM框架,还有测试代码。

    .net版ORM代码示例

    简单讲述orm使用,对于学习orm的很有帮助。

    .NET ORM框架

    ORM框架 C#.NET ORM框架ORM框架 C#.NET ORM框架ORM框架 C#.NET ORM框架ORM框架 C#.NET ORM框架

    使用C#的Attribute(特性)实现一个简单的ORM

    【内容概要】:在C#中通过学习使用Attribute,实现一个简单的ORM框架。里面主要有两部分的内容,学习使用Attribute获得设定值;学习通过反射获取属性的值 【适应人群】:初级工程师。但需要对反射、Attribute有一定...

    K-ORM 自定义ORM工具

    工具简介:自己实现的简单的ORM工具,使用到的技术:JDBC+java反射机制。 简单的文档:rar解压后,DOC目录下:K-ORM.DOC

    Dos.ORM Demo

    选择Dos.ORM的理由:  1.上手非常简单,0学习成本。使用方便,按照sql书写习惯编写C#代码。功能强大。  2.轻量级,只有一个dll文件(不到200KB),相比于EF,NHibernate这些重量级的ORM框架,实在是太小。  3....

    Doc.ORM的演示Demo

    注:内含Demo必须的《实体生成工具》,要使用Doc.ORM的功能必须用这个工具来生成实体。 Doc.ORM特点: 1)上手简单,0学习成本。使用方便,按照sql书写习惯编写C#.NET代码。功能强大 2)高性能(与Dapper媲美,接近...

Global site tag (gtag.js) - Google Analytics