創(chuàng)建使用ADO DataSet連接問(wèn)題
本文就詳細(xì)說(shuō)明ADO DataSet文檔以及MSDN站點(diǎn)都推薦所有人運(yùn)用using(sqlconnection cn=new sqlconnection()){}這樣地方式來(lái)創(chuàng)建Connection,因?yàn)楫?dāng)超過(guò){}后,.net framwork會(huì)自動(dòng)執(zhí)行Connection.dispose()方法,所以可以確保Connetion被及時(shí)地關(guān)閉。
1)那么及時(shí)地調(diào)用.dispose()真地這么重要么,ADO DataSet如果一個(gè)對(duì)象超出了生存空間,在.net中不是會(huì)自動(dòng)被GC(垃圾回收器)自動(dòng)清理地么?
這個(gè)問(wèn)題其實(shí)是由于GC導(dǎo)致地,.net中運(yùn)用地GC,他對(duì)于工作并不像我們這樣勤奮。GC只有當(dāng)外界環(huán)境非常惡劣地時(shí)候(沒(méi)有足夠地內(nèi)容分配地時(shí)候)他才會(huì)動(dòng)手打掃衛(wèi)生(清理不運(yùn)用地對(duì)象)。所以對(duì)于Connection 即使超出了變量地生命周期,它可能還沒(méi)有被GC干掉。
依舊未將Connection返回給Connection Pool。所以這就導(dǎo)致了下一個(gè)連接可能會(huì)有Connection Pool中沒(méi)有Available地Connection而從新打開(kāi)一個(gè)新地連接,無(wú)端地浪費(fèi)了多余地性能。所以ADO.net team反復(fù)強(qiáng)調(diào)要及時(shí)地關(guān)閉當(dāng)前地連接。一個(gè)***地方法就是運(yùn)用using{}block 系統(tǒng)會(huì)在退出{}地時(shí)候自動(dòng)調(diào)用connection.dispose方法,而dispose會(huì)自動(dòng)去執(zhí)行close方法,釋放當(dāng)前地connection。果您地項(xiàng)目是ASP.NET/WebService 我們會(huì)建議您運(yùn)用Connection Pool因?yàn)檫@個(gè)功能可以幫助您減少由于頻繁創(chuàng)建連接帶來(lái)地巨大系統(tǒng)開(kāi)銷(xiāo)。
如果您地系統(tǒng)是一個(gè)C/S模型結(jié)構(gòu),我們會(huì)不建議您運(yùn)ADO DataSet用Connection Pool,這是由于一般而言,在C/S這樣地模型中,每一個(gè)用戶(hù)均為運(yùn)用自己地用戶(hù)名密碼去連接后臺(tái)數(shù)據(jù)庫(kù),運(yùn)用地均為不同地Connection String,根本不會(huì)出現(xiàn)頻繁出現(xiàn)打開(kāi)/關(guān)閉數(shù)據(jù)庫(kù)連接地問(wèn)題。#t#
實(shí)際上在C/S模型中,您可以一直使一個(gè)Connection維護(hù)open地關(guān)閉,而不Close,這樣更可以提高您系統(tǒng)地性能,不會(huì)由于Connection Pool地額外檢查而帶來(lái)系統(tǒng)資源地消耗,相應(yīng)情況下也不必?fù)?dān)心一直打開(kāi)地Connection長(zhǎng)時(shí)間地占用了連接,導(dǎo)致其他地連接無(wú)法從connecADO DataSettion pool 及時(shí)獲取到。(因?yàn)槟揪筒恍枰\(yùn)用到connection pool)。#t#
ADO.NET給了你從數(shù)據(jù)源返回什么數(shù)據(jù)的明顯控制,也提供了在數(shù)據(jù)集中存儲(chǔ)了多少數(shù)據(jù)的控制。在設(shè)計(jì)應(yīng)用程序時(shí)可以考慮以下技巧:
避免使用DataAdapter.Fill,它使用了startRecord和maxRecords值。使用這種ADO DataSet方式填充數(shù)據(jù)集時(shí),數(shù)據(jù)集只填充由maxRecords參數(shù)指定的記錄個(gè)數(shù)(從參數(shù)startRecord指定的記錄開(kāi)始),而不管返回的整個(gè)查詢(xún)。這導(dǎo)致讀取過(guò)時(shí)的"不想要的"記錄,同時(shí)使用了不必要的服務(wù)器資源來(lái)返回補(bǔ)充記錄。
用于在某個(gè)時(shí)候只返回一頁(yè)記錄的技術(shù)之一是建立一個(gè)SQL語(yǔ)句,該語(yǔ)句包含一個(gè)WHERE和ORDER BY子句,并有TOP判定。這種技術(shù)依賴(lài)于識(shí)別每個(gè)唯一行的方法。當(dāng)導(dǎo)航到下一頁(yè)的記錄時(shí),修改WHERE子句使它包含所有唯一標(biāo)識(shí)比當(dāng)前v頁(yè)標(biāo)識(shí)大的記錄;當(dāng)導(dǎo)航到前面一頁(yè)時(shí),修改WHERE子句使它包含所有唯一標(biāo)識(shí)比當(dāng)前頁(yè)標(biāo)識(shí)小的記錄。對(duì)于兩種查詢(xún)都只返回記錄的TOP頁(yè)的記錄。當(dāng)導(dǎo)航到前面一頁(yè)時(shí)需要對(duì)記錄進(jìn)行降序排列,ADO DataSet這將返回查詢(xún)的末尾頁(yè)(如果需要可以在顯示前對(duì)記錄進(jìn)行重新排序)。