• 热门专题

C#大型电商项目优化(二)嫌弃EF与抛弃EF

作者:Leon.Chen  发布日期:2015-03-13 21:17:31
Tag标签:电商  C    项目  
  • 上一篇博文中讲述了使用EF开发电商项目的代码基础篇,提到EF后,一语激起千层浪。不少园友纷纷表示:EF不适合增长速度飞快的互联网项目,EF只适合企业级应用等等。

    也有部分高手提到了分布式,确实,性能优化从数据库出发,初期就加索引,然后垂直拆分,水平拆分,读写分离,甚至是分布式事务,阳春白雪,格局很高。然而笔者希望通过渐进的过程来优化这个项目,我们缩小格局,从细节查看不同方案的优劣。

    之前提过,使用EF最主要的原因是项目时间紧迫,EF搭建速度快,熟悉的同事也多,使用方便。这个决策确实帮助我们挺过了初期的难关。在业务量增长的过程中,一些问题也逐渐暴露出来,我们开始针对问题做优化。

    问题1:部分请求响应缓慢,影响用户体验。

    使用EF做数据的增删改查,一些不规范代码也会拖慢程序效率,笔者在上一篇中已经提过。某些请求中可能包含多次数据查询与更新,如果这些细小的问题都以低效运行,那这个请求确实会很慢。然而在EF的框架下优化它,也未必能收到明显成效。以更新商品销量为例,我们上方案与代码:

    方案1

    先查出某一条数据,然后填入新算出的销量,再更新数据库,代码如下:

      //先查出数据,再更新
                var productSKU = unitOfWork.ProductSku.GetByID(dtos[0].Items[0].SKUId);
                productSKU.SalesCount = productSKU.SalesCount + dtos[0].Items[0].Quantity;
                unitOfWork.ProductSku.Update(productSKU);
                unitOfWork.Submit();

    其响应时间如图:

    方案2

    采用IQuryable,之前提到过,这种查询方式不会真的将全部数据加载到内存,代码如下:

    //2采用IQueryable查询更新
                var productSKU1 = unitOfWork.ProductSku.Get(p => p.Id == dtos[0].Items[0].SKUId);
                foreach (var item in productSKU1)
                {
                    item.SalesCount = item.SalesCount + dtos[0].Items[0].Quantity;
                    unitOfWork.ProductSku.Update(item);
                }
                unitOfWork.Submit();

    其响应时间如图:

    方案3

    直接使用SQL,简单粗暴,代码如下:

    //3直接使用sql更新
                string updateSql = @"update ProductSKU set SalesCount=SalesCount+" + dtos[0].Items[0].Quantity + " where Id='" + dtos[0].Items[0].SKUId.ToString() + "'";
                unitOfWork.ProductSku.ExecuteSqlCommand(updateSql);
                unitOfWork.Submit();

    其响应时间如图:互联网模式下的业务量激增状况,笔者仍然推荐使用EF。

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规