2016-01-27 55 views
0

我试图在Azure托管的EF6 Web应用程序中登录时以低速度引发问题。随着我所做的所有研究,我仍然不太明白为什么我的应用程序的行为方式如此。实体框架作为Web应用程序速度问题

当我第一次部署应用程序,并尝试登录时,速度很慢,这我明白为什么,这是可以接受的。随后的登录和呼叫相对较快。我不明白的是,为什么如果我不与应用程序进行大约5分钟的交互(即使我的Azure Web应用程序始终设置为启用并且是标准定价层Web应用程序),下一次登录将会回落花费20+秒。

我不太明白什么“第一次运行”意味着当有人说实体变慢时。这是否意味着“ANYONE访问网络应用程序首次”,或者是否意味着这样的意思:“当第一次使用一个特定的客户端实例化dbContext时,这是他们特定的第一次运行,并且它们的实例的应用程序/ dbcontext什么现在热身和准备“

后者似乎没有道理,因为我可以登录一台机器,并移动到另一台机器,它也会相对较快。

+0

“首次运行”将引用实体框架程序集加载到应用程序域后第一次运行EF查询。 –

回答

0

“第一次”意味着应用程序启动后第一次使用dbContext(查询)。但是,当应用程序闲置一段时间时,应用程序池将重新启动,并且下次您进入该站点时,它将重新启动。这就是为什么在一段时间没有活动的情况下,EF需要时间。

看一看this post约在蔚蓝

+0

谢谢,但他们添加的Always On功能应该可以防止根据Microsoft回收应用程序池,无论如何,谁知道他们是否说实话。 –

+0

我只是解释为什么空闲后需要时间才能开始。我不知道您是否需要使用Always On,您应该深入了解并决定最适合您的应用。 – tede24

+0

这里有另一篇关于自动启动http://stackoverflow.com/questions/14238569/force-application-start-on-azure-web-role,你应该研究这个概念(也许这职位或其他),以加速注册登录 – tede24

0

“首次运行”应用程序池重启将参照首次实体框架组件中的应用程序域加载后的EF查询运行。

EF是一个相当大的程序集,它们需要一些时间来初始加载。在第一个查询中,他们还会做很多验证模型的工作。预缓存模型的视图(MSDN)可以减少很多时间。对于有很多映射表和存储过程的数据库来说,这可能需要很长时间。我有一些项目可能需要3分钟才能启动。预测减少到约10秒。尽管如此,它还是增加了管理模式更改的复杂性。

之前的实体框架可以执行一个查询或更改保存到 数据源,必须生成一组映射视图访问 数据库。这些映射视图是一组实体SQL语句,其中 以抽象方式表示数据库,并且是为每个应用程序域缓存的元数据的一部分。如果您在同一应用程序域中创建 多个相同上下文的实例,则它们将重新使用缓存元数据中的映射视图,而不是重新生成它们的 。因为映射视图生成是执行第一个查询的总体成本的重要部分,所以实体框架使您能够预先生成映射视图并将它们包括在编译的项目中 。