利用Asp.net管道优化EntityFramework生命周期管理

本文探讨了ASP.NET中如何通过HttpApplication管道事件优化Entity Framework的性能,避免重复创建数据库上下文造成的性能损耗,并介绍了在单次请求中共享EF实例的方法。

HttpApplication是整个ASP.NET的核心,在第一次请求到抵达后,ASP.NET会创建大量HttpApplication对象置于对象池中并保持其存活。在后续请求的时候,ASP.NET会查看对象池中有无空闲HttpApplication对象,若有则直接使用,若都处于繁忙状态则重新创建。这也就是为什么网站第一次访问的速度很慢。

HttpApplication会不断处理ASP.NET分发给他的HTTP请求,在不同的时刻会触发不同的事件,我们可以将特定的处理程序注册到指定事件上,从而使的ASP.net在特定时刻执行我们的业务逻辑。这就是管道的基本原理。

在以往的代码中,为了避免互相干扰,我使用的是傻瓜式的EF生命周期管理,其代码类似这样:

    /// <summary>  
    /// 获得一个实体的投影  
    /// </summary>  
    /// <param name="exp">筛选委托</param>  
    /// <param name="selector">投影委托</param>  
    /// <returns>dynamic</returns>  
    public static dynamic GetPartEntity(Func<T, bool> exp, Func<T, dynamic> selector)  
    {  
        using (var db = new CapitalConstructionEntities())  
        {  
            return db.Set<T>().Where(exp).Select(selector).SingleOrDefault();  
        }  
    }  

而在客户端代码中,当某一个方法体内需要执行多次查询时,需要多次创建EF数据库上下文对象。DBContext这种复杂的大对象创建是非常耗时的,因为背后包含与数据库相关的非托管代码。虽然这种处理方式在小吞吐量系统中性能下降并不明显,但的确不是一种好的方式。比如下面这段代码,在一个方法内多次创建了EF上下文,造成了性能浪费:

    //保存修改  
       public string SaveChanges(int id,string type)  
       {  
           Project modify = ProjectDao.GetEntity(p => p.Project_ID== id);  
           modify.Project_Type = Trans.FCBS(type);  
           if (ProjectDao.Update(modify))  
           {  
               return JsonConvert.SerializeObject(new { Success = true, Message = "修改成功!" });  
           }  
           else  
           {  
               return JsonConvert.SerializeObject(new { Success = false, Message = "修改失败!" });  
           }  
       }  

最近看了和尚兄的代码,原来数据库上下文也可以在管道事件中实例化与销毁,在单次请求中共享一个实例,性能可以提高不少。分别在开始请求和结束请求事件中创建和析构了数据库上下文对象:

    class DBModule : IHttpModule  
        {  
            public void Dispose() { }  
            public void Init(HttpApplication context)  
            {  
                context.BeginRequest += new EventHandler(  
                        (object sender, EventArgs e) =>  
                        {  
                            context.Context.Items.Add("db", new DBContainer());  
                        });  

                context.EndRequest += new EventHandler(  
                    (object sender, EventArgs e) =>  
                    {  
                        var db = context.Context.Items["db"];  
                        if (db != null)  
                        {  
                            (db as DBContainer).Dispose();  
                        }  
                    });  
            }  
        }  

这样一来,在一次请求中只需要实例化一次EF数据库上下文对象即可。

此外还有使用Autofac来管理EF生命周期的,哪位同学知道,请赐教。

计及风电并网运行的微电网及集群电动汽车综合需求侧响应的优化调度策略研究(Matlab代码实现)内容概要:本文研究了计及风电并网运行的微电网及集群电动汽车综合需求侧响应的优化调度策略,并提供了基于Matlab的代码实现。研究聚焦于在高渗透率可再生能源接入背景下,如何协调微电网内部分布式电源、储能系统与大规模电动汽车充电负荷之间的互动关系,通过引入需求侧响应机制,建立多目标优化调度模型,实现系统运行成本最小化、可再生能源消纳最大化以及电网负荷曲线的削峰填谷。文中详细阐述了风电出力不确定性处理、电动汽车集群充放电行为建模、电价型与激励型需求响应机制设计以及优化求解算法的应用。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源、微电网、电动汽车等领域技术研发的工程师。; 使用场景及目标:①用于复现相关硕士论文研究成果,深入理解含高比例风电的微电网优化调度建模方法;②为开展电动汽车参与电网互动(V2G)、需求侧响应等课题提供仿真平台和技术参考;③适用于电力系统优化、能源互联网、综合能源系统等相关领域的教学与科研项目开发。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注模型构建逻辑与算法实现细节,同时可参考文档中提及的其他相关案例(如储能优化、负荷预测等),以拓宽研究视野并促进交叉创新。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值