C# EF6.1 DbContext内存泄漏
我对EF6.1和DbContext有问题, 我有一个非常简单的类,作为用户设置/应用程序设置的数据库存储。 所以每次重新加载设置,我的记忆都会增长。但是当我从DB out注释getItem时,内存没有增长C# EF6.1 DbContext内存泄漏,c#,entity-framework,memory,memory-leaks,C#,Entity Framework,Memory,Memory Leaks,我对EF6.1和DbContext有问题, 我有一个非常简单的类,作为用户设置/应用程序设置的数据库存储。 所以每次重新加载设置,我的记忆都会增长。但是当我从DB out注释getItem时,内存没有增长 private SettingItem GetSettingItem(SettingsDbContext context, String appName, String section, Byte scope, String name, String host, Int32? userId,
private SettingItem GetSettingItem(SettingsDbContext context, String appName, String section, Byte scope, String name, String host, Int32? userId, Int32? tenantId)
{
IQueryable<SettingItem> items = (from t in context.SettingItem.AsNoTracking()
where t.Enabled
where t.ApplicationName == appName
where t.Section == section
where t.SettingScope == scope
where t.Name == name
where (t.Host == null && host == null) || t.Host == host
where (!t.UserId.HasValue && !userId.HasValue) || t.UserId == userId
where (!t.TenantId.HasValue && !tenantId.HasValue) || t.TenantId == tenantId
select t);
//return context.SettingItem.FirstOrDefault();
return items.FirstOrDefault();
}
public Object GetSetting(String appName, String section, Byte scope, String name, String host, Int32? userId, Int32? tenantId = null)
{
using (SettingsDbContext context = new SettingsDbContext(ConnString))
{
SettingItem item = GetSettingItem(context, appName, section, scope, name, host, userId, tenantId);
if (item == null)
return null;
if (item.BinValue != null)
return item.BinValue.ToArray();
if (item.StringValue != null)
return item.StringValue;
return null;
}
}
private setingItem getsetingItem(setingsDBContext上下文、字符串appName、字符串部分、字节范围、字符串名称、字符串主机、Int32?用户ID、Int32?租户ID)
{
IQueryable items=(来自context.SettingItem.AsNoTracking()中的t)
其中t.已启用
其中t.ApplicationName==appName
其中t.截面==截面
其中t.SettingScope==范围
其中t.Name==Name
其中(t.Host==null&&Host==null)| | t.Host==Host
其中(!t.UserId.HasValue&!UserId.HasValue)| | t.UserId==UserId
其中(!t.TenantId.HasValue&!TenantId.HasValue)| t.TenantId==TenantId
选择t);
//返回context.SettingItem.FirstOrDefault();
返回项。FirstOrDefault();
}
公共对象GetSetting(字符串appName、字符串段、字节范围、字符串名称、字符串主机、Int32?userId、Int32?tenantId=null)
{
使用(SettingsDbContext上下文=新的SettingsDbContext(ConnString))
{
SettingItem=GetSettingItem(上下文、appName、节、范围、名称、主机、用户ID、租户ID);
如果(项==null)
返回null;
如果(item.BinValue!=null)
return item.BinValue.ToArray();
if(item.StringValue!=null)
返回item.StringValue;
返回null;
}
}
所以我做了很多测试,
GetSettingItem返回null。没有内存泄漏
返回新的设置项,没有内存泄漏,
如果返回context.SettingItem.FirstOrDefault(),则泄漏速度会稍低/稍慢
作为Lambda的语句是相同的结果
我不知道这句话的问题在哪里
对于每个加载的设置,该方法执行一次。
在一个单独的测试中,我用Ado.Net获得了SettingItem,现在增加的内存非常慢(100次执行中有100kb)。因此,主要泄漏不在SettingsProvider中,而是在DbContext中
有人想办法修复它,因为在EF环境中使用Ado.Net是非常肮脏的
问候
Marc你为什么决定内存泄漏?你用什么工具来检测它?您分析过您的应用程序吗?您运行了多长时间的测试?因为GC可能只在一段时间后启动,所以可能在几分钟后内存再次下降(或保持不变)。或者它与EF命令池或缓存有关……您是否检查了生成的查询?我猜第一个默认值作用于所有过滤元素的内存。为什么不使用Context.Settings.AsNoTracking().FirstOrDefault(t=>)?您好,我先用任务管理器测试了一个小时。在开发环境中,我也看到了它,在开发环境中,进程增长到20GB。然后我把这句话注释掉,没有增长。由于我运行了一个单独的测试,选择是由Ado.Net进行的,该方法现在具有功能,但没有增长。最后的测试是用JetBrains公司的MemoryProfiler进行的。Alexandre的想法已经过测试,但结果与之前一样。这个表只有100行,语句只返回一行,同样在我编写SingleOrDefault()时,它也在增长。