`
xiaoliang330
  • 浏览: 117096 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hibernate延迟加载 与 web应用 独立缓存架构的冲突

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

http://blog.csdn.net/lovingprince/archive/2009/12/28/5089823.aspx


目前开发的项目中,想应用memcached,但遭遇hibernate延迟加载的问题,导致延迟加载的对象在序列化时失败,这样缓存无法应用。(暂时想用的解决办法就是去掉延迟加载,自己实现一对多关系的关联,这个改动是有多大,可想而知,所以设计很重要。)

分享到:
评论

相关推荐

    S-S-H工作原理

    - 可选开启,由第三方缓存组件实现(如EHCache),生命周期与应用程序相同。 - 配置方式: - 在`hibernate.cfg.xml`中添加 `<property name="hibernate.cache.use_second_level_cache">true</property>` 来启用。...

    java经常用到的面试题,多年收集公司的面试资料整理

    了解第二级缓存、延迟加载、批处理更新等高级特性是加分项。 ### 第十章 数据库篇 数据库知识包括SQL语言(增删改查、索引、事务、存储过程)、数据库设计(范式、表关联)、性能调优(查询优化、索引优化)等。...

    百度面试题汇总(java)

    8. **Hibernate Session缓存延迟加载原理**:延迟加载可以在不立即加载关联对象的情况下获取实体对象,提高性能。 9. **OpenSessionInView模式下的Transaction、数据库连接、HibernateSession管理**:该模式用于将...

    java面试题

    71.7. Hibernate是如何延迟加载? 60 71.8. Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 60 71.9. 说下Hibernate的缓存机制 60 71.10. Hibernate的查询方式 60 71.11. 如何优化Hibernate? 61 71.12...

    (2024)跳槽涨薪必备精选面试题.pdf

    - 如果父类加载器无法加载,则由子类加载器尝试加载。 5. **Tomcat中为什么要使用自定义类加载器** - 解决类路径冲突问题。 - 提高安全性,避免不同应用间类的相互干扰。 6. **Tomcat如何进行优化?** - 调整 ...

Global site tag (gtag.js) - Google Analytics