【发布时间】:2012-10-26 09:14:31
【问题描述】:
不,我第二个问题的答案不是冬天。
前言:
我最近一直在对 Entity Framework 进行大量研究,一直困扰着我的是它在查询未预热时的性能,即所谓的冷查询。
我浏览了关于 Entity Framework 5.0 的 performance considerations 文章。作者介绍了 Warm 和 Cold 查询的概念以及它们之间的区别,我自己也注意到了这一点,但并不知道它们的存在。这里可能值得一提的是,我背后只有六个月的经验。
现在我知道如果我想在性能方面更好地理解框架,我还可以研究哪些主题。不幸的是,Internet 上的大多数信息都已过时或带有主观性,因此我无法找到有关 Warm 与 Cold 查询主题的任何其他信息。
到目前为止,我基本上注意到的是,每当我必须重新编译或回收命中时,我的初始查询都会变得非常慢。正如预期的那样,任何后续数据读取都很快(主观)。
我们将迁移到 Windows Server 2012、IIS8 和 SQL Server 2012,作为一名初中生,我实际上为自己赢得了先于其他人测试它们的机会。我很高兴他们引入了一个预热模块,可以让我的应用程序为第一个请求做好准备。但是,我不确定如何继续预热我的实体框架。
我已经知道值得去做的事情:
- 按照建议提前生成我的视图。
- 最终将我的模型移动到单独的程序集中。
按照常识,我认为可能是错误的做法:
- 在应用程序启动时读取虚拟数据以加热事物 建立、生成和验证模型。
问题:
- 在我的 Entity Framework 上随时实现高可用性的最佳方法是什么?
- 在什么情况下实体框架会再次“变冷”? (重新编译、回收、IIS 重启等)
【问题讨论】:
-
弄清楚这是视图生成还是查询编译对您影响最大。如果这是视图生成,则使用预编译视图。如果这是查询 - 你有一个很大的复杂层次结构吗?请注意,昂贵的事情通常会在每个应用程序域发生一次并被缓存,因此在卸载应用程序域并创建新的应用程序域时会出现此类问题。
-
我已经提到了视图生成@Pawel,层次结构并不复杂,甚至一点也不复杂。但问题也是主要的。按照您所说的,我将研究何时卸载应用程序域。但是,这仍然无助于另一个问题,即加热实体框架,以防万一,就像你说的那样,应用程序域被卸载。在这一点上,似乎应用程序域被卸载了,我不知道为什么,回收只在晚上,idling 设置为 0。
-
为什么您认为读取虚拟数据是错误的方法?
-
感觉不太对劲,我想可能有更优雅的东西我不知道。但是,如果这是唯一的解决方案,并且知识渊博的人可以确认没有其他方法,我会选择它。
-
我遇到的一个问题是应用程序池在一段时间不活动后关闭(由于流量低)是创建一个服务,该服务以设定的时间间隔发出请求到一个您的网页。这可以防止在第一次请求时重新启动应用程序池之前的长时间延迟。或者您可以使用 www.pingalive.com 之类的免费服务来 ping 您的域/IP。这也有助于防止您的缓存对象在过期之前被清除。
标签: asp.net asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5