【发布时间】:2014-03-14 17:19:16
【问题描述】:
所以我使用 web api 来公开数据服务。最初,我将 dbcontext 创建为静态内存,每次在 IISExpress 下打开项目时,内存都会膨胀到超过 100MB。我知道由于此处已解决的答案,不建议使用静态:
Entity framework context as static
所以我继续将我的应用程序转换为使用常规的非静态 dbcontext 并在我的 api 中包含一个 dispose 方法:
protected override void Dispose(Boolean disposing)
{
if (provider.Context != null)
{
provider.Context.Dispose();
provider = null;
}
base.Dispose(disposing);
}
现在每次我打电话时,它都会通过这个方法并进行处理。现在,我打开应用程序,仍然气球到100k,每次打电话时,我都会查看我的iisexpress进程的内存,它一直在上升,并且在dispose后不再下降,它一直在增加到几乎200MB+。
不管是不是静态的,只要我使用它,内存就会爆炸。
最初我认为是我的 web api 导致了它,直到我删除了所有服务并在我的 api 中创建了 EF 对象(我使用的是breathjs,所以这段代码很简单,实际的实现在下面,但对内存消耗没有影响):
private DistributorLocationEntities context = new DistributorLocationEntities();
然后 bam,立即 110MB。
在我使用它时如何释放内存有什么有用的提示和调整吗?我应该在我的 dispose() 中添加垃圾收集吗?像这样快速分配和释放内存有什么陷阱吗?例如,我每次敲击键以完成“自动完成”功能时都会调用该服务。
我也不确定如果我把它投入生产会发生什么,我们有几十个用户访问数据库;我不希望用户将内存增加到 1 或 2GB 并且它不会被释放。
旁注:我现在所有的数据服务都是搜索,所以没有保存更改或更新,尽管以后可能会有。此外,我不会将任何 linq 查询作为数组或可枚举返回,它们在整个服务调用过程中仍然是可查询的。
还有一件事,我确实使用了微风,所以我将我的上下文总结如下:
readonly EFContextProvider<DistributorLocationEntities> provider = new EFContextProvider<DistributorLocationEntities>();
以及随之而来的花絮:
Doc for Breeze's EFContextProvider
proxycreationenabled = 假
ladyloadingenabled = 假
不包括 idispose
但无论如何我仍然处理上下文,这没有区别。
【问题讨论】:
标签: asp.net-web-api entity-framework-5 breeze