实体框架内存泄漏多次插入
本文关键字:插入 泄漏 框架 内存 实体 | 更新日期: 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上)