实体框架占用大量内存(可能是内存泄漏?)

时间:2012-10-12 18:46:41

标签: wcf entity-framework iis entity-framework-4 autofac

我们在WCF服务(我们的业务\应用层)中使用EF4.3.1。我们在现有数据库和Fluent Mapping(EntityTypeConfiguraiton)中使用EF Code First。 为每个请求创建一个DbContext实例,然后将其处理掉。

我们有一个使用DbContext的通用存储库。

在测试服务器上运行时,我们发现业务层应用程序池在30分钟左右的时间内内存不足,有10个并发用户。我们转储了IIS工作进程,发现EF占用了大量内存,EF创建的大对象堆上有很多对象。我们可以看到从堆上的DB检索的数据的对象。不确定DbContext dispose是否正在处理这个问题。 GC中的%时间非常高(> 16%)。 我们在转储文件中注意到的一件奇怪的事情是,有一个巨大的字符串对象(大约87MB)存储了我所有映射文件的字符串表示。我发现这很奇怪,

有没有人遇到EF的内存泄漏问题?如果我们使用EF有问题,也请告诉我们。如果需要更多详细信息,请告诉我。

由于 普拉萨德

修改 我们使用AutiFac DI(WCF集成)注入DbContext实例。 Dbcontext的生命周期是InstancePerLifeTime(每个http请求一个请求)。我们已经实现了这种方式,在一个HTTPrequest中的所有存储库实例中共享DbContext的实例。

我们访问数据库的方式是 // 宣言 IGenericRepository UserRepository {get; set;} //使用AutoFac注入属性

//用法 var user = UserRepository.FindBy(u => u.userid ==“test@test.com”);

我们没有在存储库中使用显式事务。

1 个答案:

答案 0 :(得分:2)

在递归查询大量记录(数百万)而不处理DbContext时,我们遇到了类似的问题。使用WCF服务的无状态特性,并且因为您正在处理'DbContext',这可能不是您的问题(除非每个用户在一次方法调用中同时将大量数据拉入上下文中)。

确保将每个数据库逻辑块包装在using语句中。这应该允许垃圾收集器从内存中删除上下文中的所有内容。

例如:

public void MyWcfMethod()
{
    using(MyDbContext db = new MyDbContext ())
    {
        // All calls to database go here.
    }
}

我唯一的另一个想法是你服务中的其他一些库(automapper等)仍然引用DbContext,从而防止超出范围。