首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在HTTP中缓存单个EF 6 DBContext是否会引起担忧?

在HTTP中缓存单个EF 6 DBContext是否会引起担忧?
EN

Stack Overflow用户
提问于 2014-05-12 15:15:40
回答 1查看 361关注 0票数 0

我正在处理一个项目,在这个项目中,对于是否要在HTTP中缓存EF 6 DBContext,我们会产生矛盾。

对于每个HTTP请求,我们实例化了多个类,并且可以在每个类上调用多个方法。

每个类实例中是否最好有一个DBContext实例,或者在HTTPContext.Cache中缓存单个in上下文可以吗?

其他因素:

  • 我倾向于每班一个DBContext,但其他人担心“新DBContext”的成本。
  • 我们不使用IoC/DI-容器。
  • 我们没有进行有意的异步操作。
  • 一些相关的答案是2010年的,我想确定这些答案是相关的。
EN

回答 1

Stack Overflow用户

发布于 2014-05-12 15:18:20

不要在请求之间缓存上下文实例。它们被设计成在一个小的范围内使用和处理。缓存的上下文将“泄漏”(或者更确切地说,消耗越来越多)内存,因为它从应用程序的所有查询和提交中积累了所有更改跟踪数据。

在使用Web应用程序时,请在每个请求中使用上下文实例。

同一份文件还提到:

上下文不是线程安全的。只要同一实体类的实例不被多个上下文同时跟踪,仍然可以创建多线程应用程序。

这完全排除了共享上下文,因为请求由ThreadPool的多个线程提供服务。

下面是如何在MVC应用程序中实现每个请求的共享上下文:

Global.asax:

代码语言:javascript
运行
复制
public class MvcApplication : System.Web.HttpApplication
{
    public const string dbcontext = "Db.Context";

    public MvcApplication()
    {
        BeginRequest += MvcApplication_BeginRequest;
        EndRequest += MvcApplication_EndRequest;
    }
    void MvcApplication_BeginRequest(object sender, EventArgs e)
    {
        HttpContext.Current.Items[dbcontext] = new BlahContext();
    }
    void MvcApplication_EndRequest(object sender, EventArgs e)
    {
        var ctx = HttpContext.Current.Items[dbcontext] as BlahContext;
        if (ctx != null)
            try
            {
                (ctx as IDisposable).Dispose();

            }
            catch (ObjectDisposedException)
            {
                //yum
            }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23612797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档