程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .NET應用訪問數據庫之數據庫的開銷問題

.NET應用訪問數據庫之數據庫的開銷問題

編輯:關於.NET

拿今天的一個例子說話吧,那就表中存放的是全國的地域信息,表結構如下:

首先用代碼生成器和存儲過程生成器生成基本表的操作,推薦兩個工具:動軟.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#代碼來處理,這樣會提升很多。當然了,獲取多少也 是很需求有關系的,不是一個固定規律。

後面的續集中還會講到緩存的使用,文件依賴緩存,數據庫依賴緩存等。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved