gpt4 book ai didi

sql-server - 具有用户分配的托管标识的 Azure SQL 数据库连接池

转载 作者:行者123 更新时间:2023-12-02 05:55:50 25 4
gpt4 key购买 nike

EF Core 连接池似乎无法与用户分配的托管身份正常工作。我的网页从 Angular 前端向 Web API Controller 发出 3 次 Ajax 调用。 Controller 使用包含实现 IDisposableDbContext 的存储库类。

我们使用默认依赖项容器和默认 DbContext 设置通过 EF Core 运行 .NET Core 3.1,因此它是 ServiceLifeTime.Scoped

我的DbContext ctor具有这样的托管身份代码。

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;

当我查看 session 计数时,每次我点击该页面,它都会增加 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 数据库的 session 数量非常有限。 https://learn.microsoft.com/en-us/azure/azure-sql/database/resource-limits-dtu-single-databases#standard-service-tier

当我使用用户 ID 和密码将其切换到标准 SQL Server 身份验证时,它会按预期工作。

使用托管身份时是否需要关闭连接池?这似乎确实有效,但我确信在关闭池的情况下建立连接需要更长的时间。

-兰迪

最佳答案

如果您在每个请求上创建一个新的DBContext,并且它在构造函数中调用credential.GetToken(...),那么您可能会得到一个每次都不同的 token ,因此连接无法池化。

在构造函数外部检索和存储 token 应该可以解决此问题。

关于sql-server - 具有用户分配的托管标识的 Azure SQL 数据库连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67384961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com