wcf - Entity Framework 消耗大量内存(可能是内存泄漏?)

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

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

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

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

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

谢谢 普拉萨德

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

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

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

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

最佳答案

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

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

例如:

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

我唯一的其他想法是您服务中的其他一些库(自动映射器等)仍然引用 DbContext 从而防止超出范围。

关于wcf - Entity Framework 消耗大量内存(可能是内存泄漏?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12865268/

相关文章:

c# - 为什么 AppDomain.CurrentDomain.GetAssemblies() 在某些情况下不返回 Global.asax 中的依赖程序集?

c# - 使用 Microsoft.Web.Administration 以编程方式安装 SSL 证书

c# - 使用 WCF 在客户端中获取签名的 SOAP 消息

wcf - 在 wcf 中找不到 404 文件或目录?

go - 如何为服务器发送事件(SSE、EventStream)配置 IIS 的 HTTPPlatformHandler

c# - Azure 移动服务出现错误 - 序列不包含匹配元素

c# - 使用children更新数据库条目

.net - 如何通过 WCF 暴露对象?

.net - WCF代理提交崩溃-终止进程

C# Entity Framework 自定义约束