Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf 实体框架占用大量内存(可能内存泄漏?)_Wcf_Entity Framework_Iis_Entity Framework 4_Autofac - Fatal编程技术网

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

Wcf 实体框架占用大量内存(可能内存泄漏?),wcf,entity-framework,iis,entity-framework-4,autofac,Wcf,Entity Framework,Iis,Entity Framework 4,Autofac,我们在WCF服务(我们的业务\应用层)中使用EF4.3.1。我们首先在现有数据库和Fluent映射(EntityTypeConfiguration)中使用EF代码。 为每个请求创建一个DbContext实例,然后将其释放 我们有一个使用DbContext的通用存储库 在测试服务器上运行时,我们发现业务层应用程序池在30分钟左右的时间内内存不足,有10个并发用户。我们对IIS工作进程进行转储,发现EF正在消耗大量内存,EF创建的大型对象堆中有许多对象。我们可以在堆上看到从th DB检索到的数据的对

我们在WCF服务(我们的业务\应用层)中使用EF4.3.1。我们首先在现有数据库和Fluent映射(EntityTypeConfiguration)中使用EF代码。 为每个请求创建一个DbContext实例,然后将其释放

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

在测试服务器上运行时,我们发现业务层应用程序池在30分钟左右的时间内内存不足,有10个并发用户。我们对IIS工作进程进行转储,发现EF正在消耗大量内存,EF创建的大型对象堆中有许多对象。我们可以在堆上看到从th 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");


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

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

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

例如:

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

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

您可以向我们展示您如何使用EF的一些事务的示例吗?@Jorge,请找到对原始问题的编辑。我们对此进行了一些分析,似乎通过一对多关系执行的Sum\Average等操作会导致速度缓慢。我们将其中一些操作移到了存储过程中,性能得到了提高。这也减少了内存压力,我们仍在进行微调,将根据我们的搜索结果添加注释Hanks Steve供您回答,但有一个问题,我们使用存储库,因此需要为HTTP请求共享DbContext,不确定如何使用它。我们已经使用Autofac DI实现了工作单元。Autofac注入DbContext,我可以在会话结束之前验证是否调用了DbContext上的Dispose。不确定为什么EF仍在消耗这么多内存-PrasadbContext是我唯一没有使用Autofac注入的依赖项,只是为了避免这个问题:)您能提供有关automapper的更多详细信息吗?可能还有参考?这是一个已知的问题和解决方案吗?