gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:11:03 26 4
gpt4 key购买 nike

我们在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com