3

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

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

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

有没有人遇到过 EF 的任何此类内存泄漏问题?如果我们在使用 EF 时出现问题,也请告诉我们。如果需要更多详细信息,请告诉我。

谢谢普拉萨德

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

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

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

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

4

1 回答 1

2

We had a similar issue when recursively querying a lot of records (millions) without disposing the DbContext. With the state-less nature of WCF services, and because you are disposing of the 'DbContext', this likely is not your problem (unless each user is simultaneously pulling a lot of data into context in one method call).

Ensure that you have each block of database logic wrapped in a using statement. This should allow the garbage collector to remove everything in context from memory.

For example:

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

My only other thought would be that some other library in your service (automapper, etc.) still has a reference to the DbContext thereby preventing from going out of scope.

于 2012-10-13T04:46:24.863 回答