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
  • 相关阅读:
    CC
    codeforces 984 E. Elevator
    codeforces 984 D. XOR-pyramid
    codeforces 984 C. Finite or not?
    codeforces 984 B. Minesweeper
    codeforces 984 A. Game
    Loj #6000. 「网络流 24 题」搭配飞行员
    2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest 训练报告
    省赛训练 分块9题
    AC自动机 hdu 2222 Keywords Search
  • 原文地址:https://www.cnblogs.com/zhuyapeng/p/5460324.html
Copyright © 2011-2022 走看看