gpt4 book ai didi

.net - 是什么导致我的 Entity Framework Core dbContext 泄漏内存?

转载 作者:行者123 更新时间:2023-12-02 19:39:34 24 4
gpt4 key购买 nike

这涉及Microsoft.EntityFrameworkCore.SqlServer,具体是2.1.14版本

我在我的服务层中使用 EF,该服务的 API 之一用于批量操作。所有上下文相关的代码都使用构造函数注入(inject)。连接字符串确实启用了 MARS。我像这样注册我的数据库上下文:

services.AddDbContext<ServiceAvailabilityContext>(options => options.UseSqlServer(saConnection));

我已确保所有调用代码都作为 Scoped Task 执行运行。我有一个批处理进程,它同时执行 50 个 Task 操作,总共 500 个,并且会尝试定期运行 500 个。但是,随着时间的推移,我注意到该服务的堆大小内存消耗一直在增长。我已经在我的开发机器上运行了批处理处理器和服务,并且还尝试运行服务运行时构建。 Memory Snapshot每个服务命令或查询都在 IMediatR IRequestHandler 中运行,只是为了确保它们是作为 Scoped 调用的,我添加了这样的管道行为:

var response = await Task.Run(async () =>
{
using (var scope = _serviceScopeFactory.CreateScope())
{
return await next();
}
});

调用堆栈基本上是 Controller -> MediatR 请求处理程序(注入(inject)上下文构造函数) -> 操作。

似乎 EF 只是将所有种类的集合保存在内存中,并且出于某种原因不释放它们,即使原始上下文已经超出范围,所有其他引用也超出了范围。我不会返回 IQueryables,每次我检索数据时,我都会立即执行 .ToList() 或 .FirstorDefault() 来完成语句。我什至从不在模型中返回实体对象本身,而是将它们类型转换为 UI 友好的对象。我也试过调用一个方法来达到断点,并手动调用 GC.Collect() 没有释放任何内存!

我的主要问题只是……为什么?我错过了什么?

最佳答案

事实证明,即使 DbContext 与 DI 范围一起使用,幕后的 ChangeTracker 也会保留对象 HashSet。我不得不更改我的检索语句以在不修改对象或分离对象时使用 AsNoTracking(),我在调用 SaveChanges() 后确实进行了更改,这消除了内存问题。

一个更简单的方法可能是将您的上下文注册为 transient 的,您不必陷入这样的困境。

关于.net - 是什么导致我的 Entity Framework Core dbContext 泄漏内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60442749/

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