【发布时间】:2021-12-21 15:59:07
【问题描述】:
我们不时在日志中看到来自 Hangfire 的以下错误:
Execution BackgroundServerProcess 由于异常在 1.12:52:00.6668371 仍处于 Failed 状态,将在 00:00:15 内重试 System.InvalidOperationException:超时已过期。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且达到了最大池大小。在 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection,TaskCompletionSource
1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 重试,DbConnectionOptions userOptions)在 System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource1 retry) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1 重试)在 System.Data.SqlClient.SqlConnection .Open() 在 Hangfire.SqlServer.SqlServerStorage.CreateAndOpenConnection() 在 Hangfire.SqlServer.SqlServerStorage.UseConnection[T](DbConnection dedicatedConnection, Func2 func) at Hangfire.Server.BackgroundServerProcess.CreateServer(BackgroundServerContext context) at Hangfire.Server.BackgroundServerProcess.Execute(Guid executionId, BackgroundExecution execution, CancellationToken stoppingToken, CancellationToken stoppedToken, CancellationToken shutdownToken) at Hangfire.Server.BackgroundProcessingServer.RunServer(Guid executionId, Object state) at Hangfire.Processing.BackgroundExecution.Run(Action2 callback, Object state)
似乎我们正在最大化 SQL 连接池中的连接数。
我想以某种方式检测到这一点并清除池。我如何检测它?我可以为此使用作业过滤器吗?
【问题讨论】:
-
您是否使用
using处理所有连接对象?如果你这样做,出现这个问题是非常不寻常的,除非你正在敲击数千个查询(然后你可能还有其他问题) -
是的,我们正在处理。这是在服务中运行的,我们仅在负载非常重的情况下才会看到这种情况。
-
听上去还是很奇怪,你确定你的地方没有泄漏吗?也许您应该只增加池大小。但我会调查为什么有这么多并发查询正在运行,也许你可以实现一些缓存策略
-
“重载”是什么意思?我同意@Charlieface,大多数时候,池耗尽是代码问题的标志。如果您的所有堆栈跟踪都相同,我会说您正在尝试启动太多服务器(您应该只需要一个)