新聞中心
本文將從一個實例講述.NET應(yīng)用訪問數(shù)據(jù)庫的開銷問題。作者主要是從.NET應(yīng)用訪問數(shù)據(jù)庫的遍歷順序改進講起。當然,與之配套的也就是我們熟悉的SQL Server數(shù)據(jù)庫。

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),萊陽企業(yè)網(wǎng)站建設(shè),萊陽品牌網(wǎng)站建設(shè),網(wǎng)站定制,萊陽網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,萊陽網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
拿今天的一個例子說話吧,那就表中存放的是全國的地域信息,表結(jié)構(gòu)如下:
首先用代碼生成器和存儲過程生成器生成基本表的操作,推薦兩個工具:動軟.Net代碼生成器- 全功能的三層架構(gòu).Net代碼生成器和codeplex上面的一個存儲過程生成工具Stored Procedure Generator (for SQL Server 2000/2005 ... 。
現(xiàn)在提供了一個方法,可以獲取***和二級地域的信息,最開始的做法是先獲取***的地域信息,然后循環(huán)***地域信息,獲取它的子節(jié)點。
- List
topDistrictList = new List (); - 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;
上面的做法,可以實現(xiàn)功能,***測試獲取一級和二級的地域信息,花費時間5秒左右,不說能接受吧,起碼可以忍受。HttpWatch: An HTTP Viewer and HTTP Sniffer for IE and Firefox 這個工具可以查看瀏覽器獲取數(shù)據(jù)的時間。
后面又寫了一個方法,可以根據(jù)地域編號和想要獲取的層級數(shù)目,獲取指定地域下面的N層地域。和上面差不多,完成后一次是,一次獲取上海下面的二級花費10秒,獲取三級50秒。這好像就不能忍受了吧。
然后進行優(yōu)化,代碼如下,變成一次獲取二級的數(shù)據(jù),然后用C#代碼來生成層級關(guān)系。
- List
districtList = new List (); - 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
; - }
- return top as List
;
作者后續(xù)
提到數(shù)據(jù)庫的訪問,尤其是遞歸層級調(diào)用問題,應(yīng)該減少往返數(shù)據(jù)庫的次數(shù),而是從數(shù)據(jù)庫將所需數(shù)據(jù)一次性獲取出來,然后在C#代碼中處理成樹形層級關(guān)系,這樣會提升很大的效率。
其實遞歸這種東西,用在數(shù)值計算中還可以,如果是復雜處理就***不用了,很消耗CPU和內(nèi)存的,因為要使用棧存放很多內(nèi)容。只是代碼看起來好理解,量大、操作復雜還是轉(zhuǎn)成非遞歸的好。
如果層級不多,變化不大,可以考慮使用緩存,效率就會更高。具體緩存的應(yīng)用可以參看李天平的:系統(tǒng)緩存全解析 ,后面我可能也會寫一兩篇這方面的文章。
上一篇我們討論的數(shù)據(jù)是全國的行政地域信息,它有固定的格式。每個行政區(qū)劃的編碼長度都是12位,總共分5級來管理,前兩位代表31個?。ㄖ陛犑校?,往后兩位代表一般的市(州),往后兩位代表市中的區(qū)(縣),往后三位是街道辦事處,***三位是居民委員會(社區(qū))。
系統(tǒng)中其實有很多類似的類型編碼都被 放在數(shù)據(jù)庫中,有的是一級的,有的是分層級關(guān)系的。就像上面的地域信息,全國的5級總共有8萬左右條數(shù)據(jù)。***的辦法是一次將他們讀取到服務(wù)器的內(nèi)存中,形成樹形層級,放在緩存中,如果有需要就直接獲取返回給客戶端,這樣可以較少很多的數(shù)據(jù)庫消耗。當然,前提是這類信息的變動很小,幾乎沒有變化。系統(tǒng)緩存全解析6:數(shù)據(jù)庫緩存依賴 中介紹了,可以使用數(shù)據(jù)庫依賴緩存,這樣就不怕數(shù)據(jù)庫內(nèi)容有變化了,如果有變化,會自動更新緩存。緩存的正確使用,可以極大的提供效率
網(wǎng)站名稱:實例講解.NET應(yīng)用訪問數(shù)據(jù)庫的開銷問題
分享路徑:http://m.fisionsoft.com.cn/article/djjdshp.html


咨詢
建站咨詢
