什么时候应该避免使用NHibernate';什么是延迟加载功能?

什么时候应该避免使用NHibernate';什么是延迟加载功能?,nhibernate,orm,performance,lazy-loading,Nhibernate,Orm,Performance,Lazy Loading,关于NHibernate的延迟加载,我听到的大部分是使用它比不使用它要好。为了减少瓶颈,最小化数据库访问似乎是有意义的。但几乎没有什么事情是不经过权衡的,当然,它会通过强制您拥有虚拟属性来略微限制设计。但我也注意到一些开发人员在某些常用对象上关闭了延迟加载 这让我想知道是否存在某些特定情况,使用延迟加载会影响数据访问性能 所以我想知道,在什么时候,在什么情况下,我应该避免懒洋洋地加载我的一个NHibernate持久化对象 延迟加载的缺点仅仅是额外的处理时间,还是nhibernate延迟加载也会增

关于NHibernate的延迟加载,我听到的大部分是使用它比不使用它要好。为了减少瓶颈,最小化数据库访问似乎是有意义的。但几乎没有什么事情是不经过权衡的,当然,它会通过强制您拥有
虚拟
属性来略微限制设计。但我也注意到一些开发人员在某些常用对象上关闭了延迟加载

这让我想知道是否存在某些特定情况,使用延迟加载会影响数据访问性能

所以我想知道,在什么时候,在什么情况下,我应该避免懒洋洋地加载我的一个NHibernate持久化对象

延迟加载的缺点仅仅是额外的处理时间,还是nhibernate延迟加载也会增加数据访问时间(例如,通过对数据库进行额外的往返)


谢谢

简短版本如下:

  • 如果使用延迟加载,开发会更简单。您只需以一种自然的OO方式遍历对象关系,当您请求时,您就可以得到所需的东西
  • 如果在请求之前先弄清楚需要什么,并在一次数据库访问中请求,那么性能通常会更好

  • 在过去几年中,我们一直关注快速发展时代。现在我们有了坚实的应用程序和用户基础,我们正在优化数据访问

    对于延迟加载,通常的折衷方法是先对数据库产生较小的影响,但从长远来看,最终会对数据库产生更多的影响。 如果没有延迟加载,您将抢占前面的整个对象图,一次吸收一大块数据。这可能会导致UI中的延迟,因此通常不鼓励这样做。然而,如果您有一个公共对象图(不仅仅是单个对象,否则就不重要了!),并且您知道它将被频繁地访问,并且从上到下,那么立即将其向下拉是有意义的

    例如,如果您正在执行订单管理系统,您可能不会在摘要屏幕上下拉每个订单的所有行或所有客户信息。延迟加载可以防止这种情况发生


    我想不出一个不立即使用它的好例子,但我确信,在某些情况下,您可能需要对对象图进行大量加载,比如在应用程序初始化时,以避免在后续处理过程中出现延迟。

    在从数据库加载对象的急切性和惰性之间存在明显的性能权衡

    如果您使用即时加载,那么在一个查询中会吸收大量数据,然后可以缓存这些数据。这在应用程序启动时最常见。您正在用内存消耗换取数据库往返

    如果您使用延迟加载,那么在单个查询中只会吸收最少的数据,但是任何时候您需要与初始数据相关的更多信息时,都需要对数据库进行更多的查询,而数据库性能问题通常是大多数应用程序中的主要性能瓶颈

    因此,一般来说,您总是希望准确地检索整个“”所需的数据,不多不少。在某些情况下,您可能不确切地知道您需要什么(因为用户正在通过向导或类似的方式工作),在这种情况下,在进行时延迟加载可能是有意义的


    如果您使用的是ORM,并且专注于快速添加功能,并且稍后会回来优化性能(这是非常常见的,也是一种很好的方法),那么将延迟加载作为默认方法是正确的。如果稍后(通过性能评测/分析)发现您有一个查询来获取一个对象,然后有N个查询来获取与该原始对象相关的N个对象,那么您可以将该段代码更改为使用即时加载,只命中数据库一次,而不是N+1次(N+1问题是使用延迟加载的一个众所周知的缺点).

    如果您在使用nhibernate处理数据库访问的客户端和服务器之间使用Web服务,则使用延迟加载可能会有问题,因为对象将被序列化并通过Web服务发送,随后使用“对象”在对象关系的更底层,需要使用其他Web服务重新访问数据库服务器。在这种情况下,使用延迟加载可能不太好。需要注意的是,如果您将延迟加载改为延迟加载,那么在获取内容时要小心,这很容易让您无法彻底考虑这一点,并最终获取几乎整个数据库……

    我看到许多性能问题都是由于Hibernate中错误的加载行为配置造成的。我想NHibernate的情况也一样。我的建议是始终使用惰性关系,然后在类似于查询的获取连接中使用急切的获取状态。这样可以确保不会加载太多数据,并且可以避免太多SQL查询


    通过一个查询很容易使一个懒惰的发布变得急切。反过来几乎不可能。

    总体性能可能更好,但有时较大的对象图负载可能会影响外观性能,这有时会对用户造成更大的影响。非常好。加载基础知识。展示。Ajax可以根据需要遍历值。但是如果你在项目变得如此庞大之后开始使用懒散加载,那么改变很多事情就太晚了。我认为最好的方法是在一次查询中找出需要从数据库中获取哪些数据。在这种方法中,您可以缓存这些对象,但不能缓存那些懒散加载的对象。@Meysam我同意您的看法,但通常情况下,您正在构建原型或刚刚开始一个项目,在那个时候寻找最高性能可能不是最有效地利用时间。例如,你花了太多时间为一段代码规划完美的性能场景,结果却在Sprint3之前发现该项目的性能有所不同