启动/首次查询极慢
Posted
技术标签:
【中文标题】启动/首次查询极慢【英文标题】:Startup/first query extremely slow 【发布时间】:2018-03-22 20:13:15 【问题描述】:“创建/编译”我的 DbContext 需要一段时间(3 分钟以上)。 Web 服务器在大约 5 秒后启动,但是当我对我的数据库进行第一次查询时,EF 2.0 必须在内存中“构建/创建/编译”数据库之类的,我想?下一个请求几乎是即时的。这是 DbContext 的 Database First 创建,数据库已经存在于 MSSQL 中并且有数据。 DbContext 包含大约 500 个具有关系的 DbSet。
有没有办法通过在运行 Web 服务器之前(在开发时)执行我的实体框架的 DbContext 的“创建(映射?)”来加快速度,创建它需要的文件/映射,所以第一个请求很快也是?
【问题讨论】:
Entity Framework Core 2.0 上还不存在延迟加载?每次启动应用程序,而不是每次请求。 如果您使用 IIS 托管,请查看以下内容:weblogs.asp.net/scottgu/… 或 codeproject.com/Articles/795265/… 否则,您的网络服务器可能支持类似的技术。无论如何,这是网络服务器必须启动的。在网络服务器决定之前,您的应用程序不会执行任何操作,因此无法仅在代码中执行此操作。 Web 应用程序本身在大约 5 秒后启动,这是可以接受的。这是通过 EF Core 2.0 进行的第一个查询,需要 3 分钟以上。如果我只显示一个 html 页面,它会在大约 5 秒后加载。如果我使用 ADO.NET 也是一样,查询会在 2 秒后显示。这是第一个查询(甚至是一个简单的 db.Articles.FirstOrDefault()),需要 3 分钟+,后续查询(任何查询)需要 100 毫秒左右。 是的,那又怎样?您需要在一些启动代码中发出您的第一个(虚拟)查询,而不是等待第一个用户请求。如果放到app启动中,启动会变得不可接受,所以需要放到独立于客户端的预热代码中 由于我正在尝试调试(在开发中),我想问这个“第一个虚拟查询”时间是否可以降低。因为可能 EF 正在引导自己,我问的是这个引导的结果是否可以被缓存,这样 EF 就不需要每次运行都重建整个引导,而是读取缓存的版本。 【参考方案1】:一般来说,默认情况下这是正常的实体框架行为,但从另一方面来说,有一些方法可以解决这个问题。
例如你可以试试:
禁用数据库初始化 使用预生成视图 “热”加载请尝试阅读这篇文章:
https://msdn.microsoft.com/en-us/library/hh949853(v=vs.113).aspx https://www.fusonic.net/en/blog/3-steps-for-fast-entityframework-6.1-code-first-startup-performance/ https://www.fusonic.net/en/blog/ef-cache-deployment/【讨论】:
以上是关于启动/首次查询极慢的主要内容,如果未能解决你的问题,请参考以下文章