• 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
  • 相关阅读:
    转载 消灭程序员需要百年吗?(重要参考)
    转载的一篇,代码规范
    自改的删除数据库中所有外键语句
    [转]批量禁用外键后,清空表数据
    我的分组分页查询语句
    Yii 分页方法总结
    25个Apache性能优化技巧推荐
    浅谈MindSpore的动态Shape
    C++开发总结 A
    Linux环境下开发常用命令汇总 A
  • 原文地址:https://www.cnblogs.com/zhuyapeng/p/5460324.html
Copyright © 2020-2023  润新知