EF Core 10闲置后冷启动——使用托管服务进行保活是否可接受?

编程语言 2026-07-12

我有一个使用ASP.NET Core 10、EF Core 10与 SQL Server 2017的应用。

问题:

  • 应用启动时查询正常。
  • 应用闲置几分钟后,所有EF Core查询都会变得异常缓慢(冷启动)。
  • 这会影响到所有查询,并非某一个。

我尝试过:

  • DbContext池化 (AddDbContextPool)
  • 查询拆分 (UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery))
  • 已编译查询及其他投影优化

上述方法都未能稳定解决问题。

当前的变通做法:

我实现了一个托管服务,定期执行一个简单的SQL查询(每10秒一次),以保持连接处于活动状态。这样可以防止闲置时的冷启动变慢,但我也知道这可能并不被视为最佳实践。

问题:

  1. 在EF Core 10 / ASP.NET Core 10的生产环境中,使用保持活动的托管服务是否安全且可接受?
  2. 是否有不依赖保持活动循环的情况下避免闲置导致的冷启动性能问题的推荐做法?
  3. 在生产环境中,常用哪些技术来缓解EF Core与 SQL Server的冷启动性能问题?

解决方案

其实你并不需要保持活动的服务。你可以通过连接字符串在连接池中设置最小打开连接数来获得帮助。下面是一个示例;Min Pool Size=5;Max Pool Size=200;Connect Timeout=60;Pooling=true;Connection Lifetime=300;

为缓解冷启动的性能问题,通常建议在启动阶段(Program.cs)对数据库进行预热。我见过各种建议:要么在你的上下文上执行一个非常简单的SELECT查询,要么仅仅确保context.Database.CanConnect()。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章