似乎EF Core连接池在使用用户分配的托管标识时无法正常工作。我的网页从Angular前端向Web API控制器发出3个Ajax调用。该控制器使用包含实现IDisposable的DbContext的存储库类。
我们正在运行.NET Core 3.1,使用默认依赖项容器和默认的DbContext设置,因此它是ServiceLifeTime.Scoped。
我的DbContext构造函数中有如下代码来处理托管标识。
每当我访问页面时,会话计数增加3个连接。它从未重复使用这些连接。这些连接也需等待4-5分钟才能消失。
我们正在运行.NET Core 3.1,使用默认依赖项容器和默认的DbContext设置,因此它是ServiceLifeTime.Scoped。
我的DbContext构造函数中有如下代码来处理托管标识。
var connection = (Microsoft.Data.SqlClient.SqlConnection)Database.GetDbConnection();
var options = new DefaultAzureCredentialOptions { ManagedIdentityClientId = surveyToolOptions.Value.ManagedIdentityClientId };
var credential = new DefaultAzureCredential(options);
var token = credential.GetToken(new Azure.Core.TokenRequestContext(new[] { "https://database.windows.net/.default" }));
connection.AccessToken = token.Token;
每当我访问页面时,会话计数增加3个连接。它从未重复使用这些连接。这些连接也需等待4-5分钟才能消失。
SELECT host_name, Program_name, COUNT(*)
FROM sys.dm_exec_sessions s
JOIN sys.databases AS d ON s.database_id = d.database_id
GROUP BY host_name, Program_name
由于Azure SQL数据库的会话数非常有限,这是一个问题。https://learn.microsoft.com/zh-cn/azure/azure-sql/database/resource-limits-dtu-single-databases#standard-service-tier
当我切换为带有用户ID和密码的标准SQL Server身份验证时,它按预期工作。
在使用托管标识时,我需要关闭连接池吗?那似乎可以解决问题,但我确定关闭连接池后连接需要更长时间建立。
-Randy