实体框架内存泄漏多次插入

本文关键字:插入 泄漏 框架 内存 实体 | 更新日期: 2023-09-27 18:01:48

我在数据库优先模式下使用EF 6 (SQL Server 208 R2)做了一个简单的实现。该测试的主要目的是查看系统使用EF是否会出现内存问题。创建模型后,我使用EF 6。x entityobject Generator创建对象。数据库非常简单:创建Companies和Users,然后在Company中添加Users。我创建了1000家公司和10000个用户,然后使用以下代码将所有用户添加到所有公司:

var query = (from x in db.ACCESS_USER                                 
        select x).ToList();
var query1 = (from y in db.COMPANY                                 
        select y).ToList();
foreach (var item in query1)
{
    foreach (var user in query)
    {
        ACCESS_USERSINCOMPANY acComp = new ACCESS_USERSINCOMPANY();
        acComp.COMPANYID = item.COMPANYID;
        acComp.USERID = user.USERID;
        acComp.CREATE_DATE = DateTime.Now;
        db.AddToACCESS_USERSINCOMPANY(acComp);                       
        db.SaveChanges();   
    }                   
}

当我运行这段代码时,内存开始增长,大约2分钟后,我的计算机内存耗尽。我做了一个测试,手动运行de GC,内存问题得到了解决,但我的速度急剧下降。什么好主意吗?

实体框架内存泄漏多次插入

Entity Framework缺乏一个体面的开箱即用的批量操作方法,包括批量插入。它的代理机制,虽然对惰性加载和更改跟踪都很有用,但会妨碍批量操作。

我知道这不是内存泄漏,这只是EF和所有代理的常规行为,上下文和更多,当你迭代绑定到上下文的实体时创建的。

GC最终会收集所有这些,但是GC不会同步运行,也不会以任何优先级运行,您可能已经发现了原因:性能受到影响。

根据以前的经验,我发现,有时,最好只是放弃ORM,编写普通的旧SQL命令,特别是对于批量插入。

无论如何,这里有一些有趣的链接可能会对你有所帮助。最后一个(虽然我从来没用过)似乎很有趣:
    StackOverflow问题#1
  • StackOverflow问题2
  • 项目EntityFramework。BulkInsert (CodePlex上)