【问题标题】:NHibernate vs Entity Framework 6 performance for big number of users [closed]大量用户的 NHibernate vs Entity Framework 6 性能[关闭]
【发布时间】:2014-01-30 08:16:31
【问题描述】:

我正在构建应该经常与数据库通信的大型 Web 应用程序。 我想知道我应该使用哪个库来进行 NHibernate 或 Entity Framework 6 的通信?

这是我的应用规范:

  • 用户:为大量用户构建的应用程序,让我们从注册 100,000 个用户开始。 50,000 用户在线,每个用户每秒最多可以发送 1 条消息。 每秒发送 15,000 条消息
  • 内存:保持内存在正常状态非常重要,所以我想我应该使用LazyLoad
  • 数据库:数据库结构非常复杂。
  • 用户引擎:目前我正在使用 ASP.NET MVC 5 Identity 和 Entity Framework 6 UserStore

重要的事情:

  • 舒适对我来说很重要!
  • 代码优先:我讨厌生成代码。
  • 性能:性能是这里最重要的!

【问题讨论】:

  • 实际上你应该使用 NHibernate 而不是 Fluent NHibernate 。 Fluent NHibernate 是一个工具,可让您动态构建 nhibernate 映射 xml 文件。
  • @Beatles1692 我更新了帖子,问题还是一样。

标签: c# entity-framework nhibernate asp.net-mvc-5


【解决方案1】:

作为一个使用 NHibernate 多年的人,我可能不是帮助您在 EF 或 NHibernate 之间进行选择的合适人选,但以下是我这些年来学到的一些一般性建议:

-控制权:我的意思是选择一个可以让您控制其功能的各个方面的 ORM。幸运的是,NHibernate 就是其中之一。您可以调用 SP 和其他数据库对象并将它们的结果映射到您的对象。您可以编写拦截器来拦截 NHibernate 功能等等。

-从一开始就避免一般的 ORM 问题:其中一个(对性能有很大影响)是SELECT N+1

-使用特定的分析器查看您的 ORM 是如何工作的:我认为这对我们来说非常重要,因为我们能够看到 ORM 是如何工作的,以及在后面实际运行了哪些查询。

-尽可能使用缓存:我不了解 EF,但 Nhibernate 有一个二级缓存机制,您可以使用它来缓存内存中的频繁读取和静态数据以获得更好的性能

-制定应用程序的负载测试和压力测试计划:无论您选择哪种 ORM,有时您都应该提高应用程序的性能。我认为最好的方法是看看一个应用程序是如何大规模运行的,就是以某种方式对其进行模拟并尝试对其进行调整,以使其在最佳状态下运行。

-有一个 B 计划:ORM 旨在帮助我们解决将数据存储在表中并将它们用作应用程序中的对象的困境。因此,它们为我们做了一些额外的事情,他们往往比使用表格格式的数据要慢。所以有时在我们的应用程序中使用纯表格格式而不是将其转换为对象会更好(以显示信息列表为例)

附:这可能是题外话,但您是否考虑过使用 NoSql 数据库而不是关系数据库?

【讨论】:

  • 我也用了很长时间NHibernate,我想知道哪个更好,NHibernateEF6,因为我知道NHibernate很舒服,让我完全控制. P.S 什么是非sql数据库?
  • 对不起我的错误,它实际上是 NoSql(en.wikipedia.org/wiki/NoSQL) 数据库。
  • 如果你熟悉NHibernate那么我建议你看看这个:dennisdoomen.net/2013/03/…
  • 我找到了这篇文章:weblogs.asp.net/fbouma/archive/2013/12/09/…。他们在这里谈论EF6NHibernate 3.3.3.4。如您所见,没有缓存跟踪的EF6NHibernate 3.3.3 快得多。
  • 关闭orm中一个非常重要的功能(实体追踪)当然会让一切变得更快,无需检查一级缓存中的现有实体,无需跟踪它们以自动持久化更改,等等。然后你回到一个美化的 IDbConnection 包装器,你必须自己编写代码。
猜你喜欢
  • 2020-05-07
  • 2014-11-03
  • 1970-01-01
  • 2011-02-21
  • 2011-03-19
  • 1970-01-01
  • 2014-08-07
  • 2016-06-22
  • 1970-01-01
相关资源
最近更新 更多