【问题标题】:Entity Framework in WebAPI: slow first hitWebAPI 中的实体框架:第一次命中很慢
【发布时间】:2013-12-24 21:01:25
【问题描述】:

EF 6.0.1,代码优先,两个表(父/子关系)。我正在使用该模型在 WebAPI 中查询数据并将 JSON 格式的数据(大约 3KB)返回到网站(我还测试了最简单的“.FirstOrDefault()”查询 - 在这里没有区别)。

第一次访问 WebAPI 很慢(大约 10 秒)。这与网站启动无关,此时网站已经预热。我通过 ADO 实现了相同的查询,第一次命中大约需要 1 秒。后续请求显示的 Entity Framework 损失要小得多(EF 约为 190 毫秒,ADO 约为 170 毫秒)。

我用本地 sql server 和 Azure SQL 对此进行了测试,结果相似。我分析了本地数据库:那里发生的事情不多,所有 0 Duration 请求。实体框架会产生额外的查询来检查迁移,但这些查询很精简。查看配置文件输出,我注意到所有数据库操作似乎都在大约一秒内发生,而完整的 EF 初始化过程需要 10 秒。为什么?

我已经在这里找到了一些提示,比如使用发布模式并打开“生成序列化”,但这并没有起到多大作用。在我开始实施明显的解决方法(提前初始化 EF 或只是删除 EF)之前,我希望还有一些其他的注意事项我应该检查一下。

【问题讨论】:

  • 试试 Ngen,使用 6,0,2
  • 我想补充一点,我在最近的一个项目中使用了 PetaPoco (toptensoftware.com/petapoco),还尝试了 NPOCO (github.com/schotime/NPoco),这是一个有一些改进的分支。与我在 EF 上所做的努力相比,我认为这轻而易举 - 但 EF 肯定还有其他功能。并且:根本没有启动延迟。如果您是“数据库优先”的开发人员,您应该尝试其中一种 Micro-ORM。 Dapper (github.com/StackExchange/dapper-dot-net) 功能比较多,项目比较活跃,但是我还没试过(因为功能比较多)。

标签: entity-framework


【解决方案1】:

Entity Framework 6.0.1 中存在与启动性能有关的已知问题,尤其是在附加调试器的情况下。这方面的详细信息在Entity Framework Blog 上进行了讨论,但由于 EF6.0.2 被标记为稳定,您的第一个操作应该是更新以使用它。

一般来说,EF6 与直接在 ADO 中查询相比,总是会有一些启动延迟,因为它需要加载与模型相关的东西,而直接使用 ADO 时不需要这样做。但是,在 EF6.0.1 上,这似乎比正常情况更糟。

【讨论】:

  • 升级到 6.0.2 可能需要 1 秒。我认为 - 如果我想使用 EF - 我必须在用户等待结果之前调用 MyContext.Database.Initialize(false)。由于主页上没有使用 EF,因此我可以在那里调用一个 Web 服务方法来执行此操作。但是,由于无论如何使用 ASP.NET 都会有第一次命中损失(我通过监视服务来规避),因此如果在 Application_Start 中进行此初始化将是理想的。但这意味着将 Web 服务与 Web 应用程序耦合。
  • @kirsten:我最终用 Peta Poco (toptensoftware.com/petapoco) 替换了 EF,它做得很好,没有延迟。我仍然使用 EF,但用于大型项目和代码优先方法。
  • @TvdH 实际上我删除了我的评论,因为我的问题毕竟不是 EF
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 2020-12-03
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
相关资源
最近更新 更多