【发布时间】:2012-07-12 11:32:33
【问题描述】:
在将实体框架与 SQL Server Compact Edition 一起使用时出现内存泄漏。我的情况:
我有一个大约 600MByte 大的文件。我逐行阅读,创建一个实体类并将其添加到 SQL Server CE 数据库中。内存因此增长得非常快。 Gen 0 Collections 计数器和 Gen 2 Heap Size 增长非常快(来自 Process Explorer 的信息)。如果我理解正确的 Gen 2 Heap 是用于大对象的。我认为我的实体类是一个大对象。所以 Entity Framework 保存我的对象而不释放它们。我已经尝试将它们分离并调用 GC.Collect(2) 但它没有帮助。
首先我读了这行。然后在解析行后创建一个对象。然后将其添加到数据库。这是我的数据库代码:
DBEntities dbConnection = new DBEntities();
dbConnection.My_Table.AddObject(MyObjectCreatedFromTheLine);
dbConnection.SaveChanges();
// dbConnection.Detach(MyObjectCreatedFromTheLine);
// dbConnection.Dispose();
MyObjectCreatedFromTheLine = null;
dbConnection = null;
我还读到创建的实体类(MyObjectCreatedFromTheLine)属于DbContext。所以我为每一行调用这段代码,每次都创建一个新的上下文。
我做错了什么?
【问题讨论】:
-
您应该只使用一个上下文,将所有对象添加到上下文然后调用
SaveChanges一次。还可以使用using语法糖来强制对您的上下文实例进行Dispose调用。 -
你为什么不处理你的 dbConnection?
-
我使用了 dbConnection.Dispose() 但它没有帮助。同样一开始我只使用了一个上下文,问题是一样的。然后我读到,问题是上下文保留了指向对象的指针。所以我尝试这种方式,每次都创建一个新的上下文。
-
使用我的 SqlCeBulkCopy 库快速插入到 SQL Server Compact:sqlcebulkcopy.codeplex.com
-
所以 EntityFramework 不适合批量插入。但是您可以关闭 AutoDetectChangesEnabled 以减少相当多的内存使用量。在调用
GC.Collect时,还要定期更新您的 DbContext。它不会解决问题,但会让问题变得可以忍受。
标签: c# .net entity-framework entity-framework-4 sql-server-ce