首页 > 解决方案 > IConfiguration.GetConnectionString MySql 连接池耗尽

问题描述

我有一个针对 .NET 5 的 AspNetCore Web 应用程序,它使用 Entity Framework 6(最新版本)访问 MySql 数据库,该应用程序托管在 Azure 上。很长一段时间以来,我注意到发布应用程序后需要很长时间才能启动并开始服务请求,我查看了 IIS 托管进程并注意到线程数在不断增加,经过更多研究后我能够查找导致问题的 WEB API 函数。该函数用于刷新 jwt 令牌,当站点启动时,大约有 500-600 次调用该函数,乍一看,我的第一个假设是这是我的 EF 代码,因为混合了异步和同步数据库调用,查看日志也指向了那个方向,因为有大量的 MySql 异常

error connecting: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached.

因此,我仔细查看了我的代码中任何潜在的优化和修复,但即使在那之后问题仍然存在,更令人困惑的是,在请求时根本没有连接到 mysql 服务器。

我的另一个想法是问题在于我将 dbContext 注入控制器,所以我尝试将一个新实例直接放入函数中,但问题仍然完全相同。

所以我开始感到有点绝望,但后来我尝试更改与 dbContext 初始化相关的最后一件事,这是一个如何设置 dbContext DI 的示例。

services.AddScoped(x =>
{
  //get connection string
  var connectionString = Configuration.GetConnectionString("DefaultConnection");

  //return new db context
  return new Customers.DAL.PortalDBContext(connectionString);
});

我删除了 GetConnectionString 函数并对连接字符串进行硬编码,神奇地一切都开始正常工作。所以我想我的问题是是否有人可以解释为什么会发生这种情况。

谢谢!

标签: mysqlasp.net-coreentity-framework-6

解决方案


推荐阅读