实体框架太慢/内存泄漏
本文关键字:内存 泄漏 框架 实体 | 更新日期: 2023-09-27 18:07:41
我正在做大量的工作与实体框架,像数百万的插入和更新。
然而,随着时间的推移,它变得越来越慢…
我尝试了一些方法来提高性能。如:
db.Configuration.AutoDetectChangesEnabled = false;
db.Configuration.ValidateOnSaveEnabled = false;
try too:
db.Table.AsNoTracking();
当我改变所有这些东西时,它真的变得更快了。然而,内存使用开始增加,直到它给我一个异常。
有人遇到过这种情况吗?由于
DbContext
存储您已获取或添加到DbSet
的所有实体。正如其他人建议的那样,你需要在每组操作(一组密切相关的操作-例如web请求)之后处理上下文,并创建一个新的上下文。
在插入数百万个实体的情况下,这可能意味着每1,000个实体创建一个新的上下文。这个答案为您提供了插入数千个实体所需的所有信息。
如果您只做插入和更新-尝试使用db.Database。SqlQuery(变量、对象)。
实体框架将所有附加对象保存在内存中。因此,拥有数百万个这样的对象可能会导致内存泄漏。https://github.com/loresoft/EntityFramework.Extended为更快的批量更新和删除提供了一个干净的界面。我认为它只适用于SQL Server,但它可能会给你一个快速解决你的性能问题。
可以这样更新:
context.Users.Where(u => u.FirstName == "Firstname").Delete();
可以用类似的方式进行删除:
context.Tasks.Where(t => t.StatusId == 1).Update(t => new Task { StatusId = 2 });
对于数百万的插入和更新,所有的东西都耗尽了内存,我已经尝试了所有的…
只有当我停止使用上下文并使用ADO或另一个Micro ORM如Dapper时才对我有效。