在作用域服务中调用 IServiceScopeFactory.CreateScope()
Call IServiceScopeFactory.CreateScope() in a scoped service
如果我从已使用 services.AddScoped
添加为作用域的服务调用 IServiceScopeFactory.CreateScope()
会怎样?当我调用 scope.ServiceProvider.GetRequiredService
?
时,它会创建一个新范围,然后为每个请求的范围服务创建一个新实例吗?
背景故事:
我从另一个开发人员那里得到了一个遗留项目,现在我正在尝试识别和解决几个错误。首先,在使用 Entity Framework 时,我遇到了一些看起来像是数据库连接泄漏的问题。我在高负载下看到这个错误:
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.
事实是,有一些作用域服务创建新作用域并请求 DatabaseContext,它在 EF 中默认作用域。
IServiceScopeFactory.CreateScope
将创建一个新范围,完全独立于任何当前范围。如果您从新范围解析范围内的服务,它将 return 该服务的新实例。
当您 Dispose
该范围时,应解析该范围创建的所有 IDisposable
服务。如果您正在泄漏范围内的服务实例,那么值得检查每个 IServiceScope
创建的实例是否也被丢弃。
如果我从已使用 services.AddScoped
添加为作用域的服务调用 IServiceScopeFactory.CreateScope()
会怎样?当我调用 scope.ServiceProvider.GetRequiredService
?
背景故事:
我从另一个开发人员那里得到了一个遗留项目,现在我正在尝试识别和解决几个错误。首先,在使用 Entity Framework 时,我遇到了一些看起来像是数据库连接泄漏的问题。我在高负载下看到这个错误:
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.
事实是,有一些作用域服务创建新作用域并请求 DatabaseContext,它在 EF 中默认作用域。
IServiceScopeFactory.CreateScope
将创建一个新范围,完全独立于任何当前范围。如果您从新范围解析范围内的服务,它将 return 该服务的新实例。
当您 Dispose
该范围时,应解析该范围创建的所有 IDisposable
服务。如果您正在泄漏范围内的服务实例,那么值得检查每个 IServiceScope
创建的实例是否也被丢弃。