MVC EF6
嗨,我在任何地方都找不到答案,所以我发布了自己的问题,我试图追踪内存泄漏,我的应用程序中有很多重复的字符串,使用它真的很大,它有很多代码。
我意识到,每次发出请求时,我们都在创建一个新的DB Context实例,但我们从不对其进行处理,因此,请检查我的清单并确保所有内容都得到处理。
请不要发布类似内容,只需执行以下操作即可:
using(var context = new DbContext) {}
我不能这样做,因为应用程序很大,重构将花费很多时间。我认为要做的是创建一个字典,然后在每次请求期间保存上下文,如下所示(全局asax):
protected void Application_EndRequest(object sender, EventArgs e)
{
if (User != null && User.Identity.IsAuthenticated)
{
ContextConfig.Dispose(Context.Items["UniqueRequestId"].ToString());
}
}
protected void Application_BeginRequest(Object sender, EventArgs e)
{
//Creating Unique Request ID
Context.Items["UniqueRequestId"] = Guid.NewGuid().ToString();
}
在这里,我为每个请求创建一个唯一的ID,然后最后处理在该请求期间创建的所有上下文(是的,我知道每个请求只能包含一个,但是它们确实创建了多个,但最大我见过2,所以我认为还算不错。
这是我的ContextConfig类:
public static class ContextConfig
{
private static ConcurrentDictionary<string, List<DbContext>> Config = new ConcurrentDictionary<string, List<DbContext>>();
public static void Add(string key, DbContext context)
{
//If contains key then add it, otherwise just create new instance
if (Config.ContainsKey(key))
{
Config[key].Add(context);
}
else
{
Config[key] = new List<DbContext>();
Config[key].Add(context);
}
}
public static void Dispose(string key)
{
//If contains key and list has context then dispose them.
if (Config.ContainsKey(key))
{
if (Config[key] != null && Config[key].Count > 0)
foreach (var context in Config[key])
{
context.Dispose();
}
Config[key].Clear();
((IDictionary)Config).Remove(key);
}
}
}
此后,我希望我的MemoryLeak问题得到改善,但是我认为这会以某种方式变得更糟,因为由于某些原因,我添加到列表中的实例由垃圾收集器保存,但现在我迷路了。
这是我在内存分析中看到的内容:
这些都是重复的字符串:
编辑:不确定这是否相关,但是在创建新实例时会发生
context.Configuration.AutoDetectChangesEnabled = true;
context.Configuration.ProxyCreationEnabled = false;
context.Configuration.LazyLoadingEnabled = false;