当存在许多关联时,使用像NHibernate这样的ORM - 性能问题

时间:2009-04-11 14:28:15

标签: performance nhibernate web-applications orm

我创建了一个应用程序(基于Web的应用程序),它现在拥有大量的关联。简单地说,一个帐户:

  • 有很多用户
  • 有设置
  • 有很多项目

同样是项目:

  • 有很多项目

用户:

  • 有很多任务

依此类推,加载更多关联。我希望没有什么特别不寻常的。我选择使用NHibernate为我提供了一组很好的持久化类,其中mappers定义了所有的关联。

但这种做法是对的吗?在每次向应用程序发出请求时,都会加载帐户(因为需要),然后这会从数据库中请求大量不需要的数据。延迟加载是一种选择,但我不知道我的初始方法是否更好。我在那个阶段想要的只是帐户和相关设置,那么映射是否反映了这一点?麻烦的是我想在其他方面想要帐户的所有项目,所以我需要映射器来反映所有的关联。

我担心的是,延迟加载可能只是补偿了我本身糟糕的初始架构。我很清楚,这可能只是因为我对NHibernate内部运作的了解很少。因此,我对任何有关良好实践的建议表示感谢。

3 个答案:

答案 0 :(得分:0)

默认情况下,NHibernate默认为大多数关联和对象启用延迟加载,除非您知道自己总是需要关联数据。然后,您可以选择性地切换到急切加载,以便在进入优化阶段时更有效的项目。

答案 1 :(得分:0)

Domain Driven Design在了解这些情况时帮助了我很多。 Association in DDD

在你的情况下你应该问自己的问题:你真的需要双向关联 - 或者在某些情况下单向关联是否足够?而这个决定是架构的一部分。所以你是对的。在默认情况下选择双向关联时,延迟加载是一个很大的帮助。但它可能被认为是一个设计缺陷。

答案 2 :(得分:0)

嗯,在我看来,你的建筑看起来很健康。协会很好。

考虑其他选择:

  1. 较少关联:会导致数据库设计不佳
  2. 不要使用ORM:你会发现自己正在进行“懒惰初始化”-kinda编码
  3. 一切看起来都很好,懒惰的初始化很好:) - 但是,有一些现实生活中使用的陷阱:

    1. 在使用延迟初始化的东西之前不要关闭会话(要求你“破解”你的关联上的一些无用的阅读声明以强制阅读它)。
    2. 使用NHibernate,您需要使用它执行所有DAL活动才能启用level2缓存
    3. 你会有一些开销(如果我不想知道帐户名,只是其中的用户怎么办)
    4. 这是ORM的工作方式。他们有专业人士(更容易开发,避免大量的样板代码)和骗局(更多的开销,更少的灵活性)。