zoukankan      html  css  js  c++  java
  • .NET应用访问数据库之数据库的开销问题 Virus

      拿今天的一个例子说话吧,那就表中存放的是全国的地域信息,表结构如下:

       首先用代码生成器和存储过程生成器生成基本表的操作,推荐两个工具:动软.Net代码生成器- 全功能的三层架构.Net代码生成器和codeplex上面的一个存储过程生成工具Stored Procedure Generator (for SQL Server 2000/2005 ... 。

      现在提供了一个方法,可以获取顶级和二级地域的信息,最开始的做法是先获取顶级的地域信息,然后循环顶级地域信息,获取它的子节点。

      

    代码
    List<KB.DSN.Entity.District> topDistrictList = new List<KB.DSN.Entity.District>();
                KB.DSN.BusinessAccess.District dictrictBll 
    = new KB.DSN.BusinessAccess.District();
                topDistrictList 
    = dictrictBll.GetEntityList(string.Format("DisFatherCode='{0}' {1}"0, Settings.District_Order_By));

                
    foreach (KB.DSN.Entity.District dis in topDistrictList)
                {
                    dis.ChildrenDis 
    = dictrictBll.GetEntityList(string.Format("DisFatherCode='{0}' {1}", dis.DisCode, Settings.District_Order_By));

                }
                
    return topDistrictList;

      上面的做法,可以实现功能,最后测试获取一级和二级的地域信息,花费时间5秒左右,不说能接受吧,起码可以忍受。HttpWatch: An HTTP Viewer and HTTP Sniffer for IE and Firefox 这个工具可以查看浏览器获取数据的时间。

      后面又写了一个方法,可以根据地域编号和想要获取的层级数目,获取指定地域下面的N层地域。和上面差不多,完成后一次是,一次获取上海下面的二级花费10秒,获取三级50秒。这好像就不能忍受了吧。

      然后进行优化,代码如下,变成一次获取二级的数据,然后用C#代码来生成层级关系。

      

    代码
                List<KB.DSN.Entity.District> districtList = new List<KB.DSN.Entity.District>();
                KB.DSN.BusinessAccess.District dictrictBll 
    = new KB.DSN.BusinessAccess.District();
                districtList 
    = dictrictBll.GetEntityList(string.Format(" {0} {1}", Settings.Get_Top_And_Second_District_Where,
                    Settings.District_Order_By));
                var top 
    = from c in districtList
                          
    where c.DisFatherCode.Trim() == "0"
                          select c;
                var second 
    = from c in districtList
                             
    where c.DisFatherCode.Trim() != "0"
                             select c;

                
    foreach (KB.DSN.Entity.District dis in top)
                {
                    var se 
    = from c in second
                             
    where c.DisFatherCode == dis.DisCode
                             select c;
                    dis.ChildrenDis 
    = se as List<KB.DSN.Entity.District>;
                }
                
    return top as List<KB.DSN.Entity.District>;

      组合的时候用到了LINQ的技术,好东西啊。推荐教程:LINQ体验系列文章导航

      效率大增,变成了0.5和2秒,从无可救药变成可以忍受,甚至是可以接受了,很好。

      结论

      不应该多次往返数据库进行操作,每次都要连接数据库,然后关闭,造成很大的性能消耗,应该一次获取足量的数据,然后用C#代码来处理,这样会提升很多。当然了,获取多少也是很需求有关系的,不是一个固定规律。

      后面的续集中还会讲到缓存的使用,文件依赖缓存,数据库依赖缓存等。

  • 相关阅读:
    ASP.NET MVC5 视图预编译
    Task(TPL)简单的实现Winform(WPF)异步
    工作三年了,该报多少工资?
    mongo笔记 // 一字一句的写下来,工作点滴片段
    旅行的意义- 2018年许愿
    用户需求调研,万里长征第一步
    软件变更控制
    源码解析-Abp vNext丨分布式事件总线DistributedEventBus
    源码解析-Abp vNext丨LocalEventBus
    技术番外篇丨Github Action CI/CD
  • 原文地址:https://www.cnblogs.com/virusswb/p/1679383.html
Copyright © 2011-2022 走看看