gpt4 book ai didi

c# - EF Core 和大流量导致达到最大池大小错误

转载 作者:太空狗 更新时间:2023-10-29 20:12:46 26 4
gpt4 key购买 nike

我们使用 ASP.NET Entity Framework Core 在我们的 Web API 应用程序中查询我们的 MSSQL 数据库。有时当我们有大流量时,查询数据库以这个错误结束:

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.

我想知道我们使用 DbContext 和查询的模式是否正确,或者我是否遗漏了一些使用/处置模式并且错误是由内存泄漏引起的(经过一些研究我读过然后我不应该使用 using 因为生命周期由框架管理)。我正在关注 documentation ...

我的连接字符串:

"myConnection": "Server=xxx;Database=xxx;user id=xxx;password=xxx;Max Pool Size=200;Timeout=200;"

我的 Startup.cs

public void ConfigureServices(IServiceCollection services)
{
.....
// scoped context
services.AddDbContext<MyDbContext>(
options => options.UseSqlServer(this.Configuration.GetConnectionString("myConnection")));
}

然后在 Controller 中我通过依赖注入(inject)使用了 dbcontext:

public class MyController : Controller
public MyController (MyDbContext context)
{
this.Context = context;
}

public ActionResult Get(int id)
{
// querying
return this.Context.tRealty.Where(x=>x.id == id).FirstOrDefault();
}

我应该使用类似的东西吗:

using (var context = this.Context)
{
return this.Context.tRealty.Where(x => x.id == id).FirstOrDefault();
}

但我认为当我使用 DbContext 的依赖注入(inject)时,这是一个糟糕的模式。

最佳答案

我认为问题是由将数据库上下文查询中的对象存储到内存缓存引起的。我对数据库上下文进行了一个大的 LINQ 查询,其中包含一些其他子查询。我在主查询结束时调用了 FirstOrDefault(),但不在子查询中。 Controller 很好用,它默认实现查询。

 return this.Context.tRealty.AsNoTracking().Where(
x => x.Id == id && x.RealtyProcess == RealtyProcess.Visible).Select(
s => new
{ .....

// subquery
videos = s.TVideo.Where(video => video.RealtyId == id && video.IsPublicOnYouTube).
Select(video => video.YouTubeId).ToList()), // missing ToList()
.....
}).FirstOrDefault();

还有一个问题 - 当子查询存储到内存缓存时,它们会保持与数据库上下文的连接。当我实现 Redis 分布式缓存 时,它首先因一些奇怪的错误而失败。当我将 ToList()FirstOrDefault() 写入我的所有子查询时,它会有所帮助,因为分布式缓存需要物化对象。

现在我的所有查询都已明确具体化,并且没有出现已达到最大池大小错误。因此,当存储对象从数据库上下文查询到内存缓存时必须小心。需要具体化所有查询以避免在内存中的某处保持连接。

关于c# - EF Core 和大流量导致达到最大池大小错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39763324/

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