zoukankan      html  css  js  c++  java
  • EF上下文容器,保存线程唯一性

         在工作中有个疑问,就是EF上下文容器到底创建了多少个?

    在asp.net中,EF上下文容器。如果只要有一个,则每次一个用户访问,添加一些实体,然后又不会自动销毁,就会造成内存爆炸。如果每次创建一个,则就出现一个实例调用混乱。在sp.net中,保证一个线程(一次http请求及一个管道事件),一个EF上下文容器就刚刚好,解决上面问题。

    一个线程一个上下文容器,

    解决方案1:线程缓存

    保证一个请求线程中只有一份EF容器
            protected BaseDbContext db
            {
                get
                {
                    //向线程缓存中查询,如果返回的是null,则创建,同时存入到这个线程缓存中
                    //注意的是线程缓存CallContext,而不是我们熟悉的HttpRuntime.cache
                    object efDbContext = CallContext.GetData("BaseDbContext");
                    if (efDbContext == null)
                    {
                        efDbContext = new BaseDbContext();
                        //存入到这个线程缓存中
                        CallContext.SetData("BaseDbContext", efDbContext);
                    }
                    return efDbContext as BaseDbContext;
                }
            }
    View Code

    方案2:将上下文容器保存到httpContext.Current.Items["db"]中(httpContext也是每次请求创建一个,管道事件结束就销毁)

    public static class EFFactory
            {
                public static object GetCurrentEFContext()
                {
                    if (HttpContext.Current.Items["EFContxt"]==null)
                    {
                        HttpContext.Current.Items["EFContxt"]= new BaseDbContext();
                    }
                    return HttpContext.Current.Items["EFContxt"];
                }
            }
    View Code
  • 相关阅读:
    Java容器学习之ArrayList
    Java容器学习之List
    个人感悟
    python_批量修改密码综评
    修改的一段递归文件代码
    showtimu
    20190321xlVBA_明细信息表汇总成数据表
    20190320xlVBA_考场座位设置
    RG
    wdVBA_替换删除选择题括号中的选项
  • 原文地址:https://www.cnblogs.com/zhuyapeng/p/5460324.html
Copyright © 2011-2022 走看看