Azure Functions 静态 SqlConnection - 正确的扩展方式?

Nik*_*dic 5 static sqlconnection azure azure-sql-database azure-functions

我使用带有队列触发器的 Azure Functions 来处理部分工作负载。特定函数查询数据库,这会产生扩展问题,因为大量并发函数实例 ping 数据库会导致 Azrue DB 连接的最大允许数量不断受到影响。

本文https://learn.microsoft.com/en-us/azure/azure-functions/manage-connections将 HttpClient 列为应设为静态的资源之一。是否也应该使用静态 SqlConnection 将数据库访问设为静态来解决此问题,或者通过保留常量连接对象会导致其他问题吗?

Dav*_*oft 3

数据库访问是否也应该使用静态 SqlConnection 进行静态化

当然不。每个函数调用都应在 using 块中打开一个具有相同连接字符串的新 SqlConnection。目前尚不清楚运行时将对应用程序的单个实例进行多少个并发函数调用。但如果它超过 1,那么单例 SqlConnection 就是一件坏事。

我想知道您在 SQL 数据库中到底遇到了哪个限制,连接限制还是并发请求限制?无论哪种情况,我都有点惊讶(不是函数专家),您会得到如此多的并发函数调用,因此可能会发生其他情况。就像你泄漏了 SqlConnections 一样。

但阅读 Functions 文档后,我的猜测是,函数运行时是通过启动函数应用程序的多个实例来扩展的。您的 .NET 应用程序可以在单个进程中扩展,但这显然不是 Functions 的工作方式。Functions 应用程序的每个实例都有自己的 SQL Server 连接池,默认情况下每个连接池可以有 100 个连接。

也许如果您严格限制连接字符串中的最大池大小,则不会打开那么多连接。当您达到最大池大小时,对 SqlConnection.Open() 的新调用将阻塞长达 30 秒,等待池中的 SqlConnection 变得可用。因此,这不仅限制了应用程序每个实例的连接使用,还限制了负载下的吞吐量。

  • 最近在函数中引入 DI 会改变什么吗?他们将 SqlConnection 指定为应该属于 Singleton 范围的内容。如何将 SqlConnection 作为函数中的单例执行... https://learn.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection (4认同)