使用ADO.NET2.0提升數(shù)據(jù)交互性能(2)_.Net教程
推薦:使用ADO.NET2.0提升數(shù)據(jù)交互性能(1)前言: 這篇文章起源于在公司寫(xiě)的一個(gè)PPT,但是由于PPT本身的限制很多內(nèi)容無(wú)法表達(dá)或是詳細(xì)的解釋?zhuān)谑亲兿露藳Q心。寫(xiě)篇文檔! 在這篇文章里我將盡量簡(jiǎn)單的描述下ADO.NET 2.0的新特
三:異步執(zhí)行Command命令
在 ADO.NET 2.0 以前,通過(guò) Command 類(lèi)(如 SqlCommand、OleDbCommand等)執(zhí)行 SQL
命令的線程一定要停下來(lái)等待執(zhí)行結(jié)果。ADO.NET 2.0 新增了異步程序訪問(wèn)接口(asynchronous API),讓線程發(fā)出命令后可以繼續(xù)執(zhí)行接下去的程序代碼。
而在 ADO.NET 2.0 當(dāng)前的版本只有 SqlClient 支持異步程序訪問(wèn)接口。
以往編寫(xiě)程序時(shí),我們可以直接通過(guò).NET Framework 所提供的多線程機(jī)制,或是以 Delegate 類(lèi)包裝多線程的方式,在 .NET Framework 所提供的異步架構(gòu)下,設(shè)計(jì)調(diào)用執(zhí)行 Command 對(duì)象實(shí)例。這些方法都是讓一條工作線程(Worker Thread)停止在后臺(tái)中等待執(zhí)行結(jié)果,一旦有結(jié)果后,工作線程再通過(guò)標(biāo)準(zhǔn)的機(jī)制告知結(jié)果。
原本 ADO.NET 的 Command 對(duì)象執(zhí)行 SQL 語(yǔ)法的方法有
ExecuteReader、ExecuteNonQuery、ExecuteXmlReader 以及 ExecuteScalar 等,搭配 .NET
Framework 原來(lái)就提供的異步模型慣例,除了 ExecuteScalar 方法外,其余的方法都新增了以 Begin 和 End 關(guān)鍵字開(kāi)始的一對(duì)方法。也就是說(shuō) ExecuteReader 方法是同步執(zhí)行,若要以異步的方式執(zhí)行相同的功能,則調(diào)用 BeginExecuteReader 和 EndExecuteReader 這一組方法。在 .NET Framework 中,以 Begin 為字首的方法負(fù)責(zé)傳入同名方法所需的參數(shù),而以 End
為字首的方法用來(lái)取回執(zhí)行結(jié)果,
例如某個(gè)方法的定義如下:
public override int ExecuteNonQuery()
則以異步調(diào)用的起始方法定義如下:
public IAsyncResult BeginExecuteNonQuery(AsyncCallback callback, object stateObject)
Begin~ 系列的方法會(huì)多加存放回調(diào)方法(Delegation)的指針參數(shù),也就是上述語(yǔ)法中的 callback 參數(shù)。并提供語(yǔ)法中的 stateObject參數(shù),讓你設(shè)置想要帶到 End~ 對(duì)應(yīng)方法的信息。而 Begin~ 系列方法最后返回的是代表異步執(zhí)行狀態(tài)的 IAsyncResult 對(duì)象實(shí)例,而不是原本同步執(zhí)行方法的返回結(jié)果,你可以藉此查詢(xún)異步執(zhí)行的狀況。
而獲得執(zhí)行結(jié)果的方法定義如下:
public int EndExecuteNonQuery(IAsyncResult asyncResult)
在調(diào)用與 Begin~ 對(duì)應(yīng)的 End~ 方法時(shí),需要帶入 Begin~ 方法所返回的 IAsyncResult
對(duì)象實(shí)例。異步執(zhí)行完畢后,取回與原先同步執(zhí)行方法相同的執(zhí)行結(jié)果。
由于我們?cè)趫?zhí)行完 Command 對(duì)象訪問(wèn)數(shù)據(jù)庫(kù)的方法后,都會(huì)返回對(duì)象,如 ExecuteReader 取回 DataReader實(shí)例;ExecuteNonQuery 取回受影響的記錄條數(shù);ExecuteXmlReader 取回 XmlReader 實(shí)例。因此大概都需要通過(guò)End系列方法來(lái)獲得執(zhí)行結(jié)果,否則這些結(jié)果就遺失在系統(tǒng)中。
若要異步執(zhí)行 Command 命令,另一個(gè)必需設(shè)置的是:數(shù)據(jù)庫(kù)連接字符串內(nèi)要加上 async=true 屬性。若連接字符串沒(méi)有加上該屬性,而通過(guò) Command對(duì)象實(shí)例調(diào)用異步執(zhí)行的方法,則會(huì)產(chǎn)生異常(exception)。若 Command 通過(guò)連接執(zhí)行時(shí),重頭到尾都是以同步的方式執(zhí)行,則依照默認(rèn) async=false 的方式設(shè)置比較節(jié)省資源。若某些命令需要同步執(zhí)行,另一些需要異步執(zhí)行,則可以考慮使用不同的連接。
在介紹范例應(yīng)用程序前,我們先稍微談一下 .NET Framework 所提供的公共的異步運(yùn)行應(yīng)用程序設(shè)計(jì)模式,不只是 ADO.NET2.0,在其他訪問(wèn)耗時(shí)的程序編寫(xiě)上,也都可以套用這個(gè)模式。
.NET Framework內(nèi)置了讓?xiě)?yīng)用程序異步運(yùn)行的功能,讓你在編寫(xiě)應(yīng)用程序時(shí),不會(huì)因?yàn)槟承┖臅r(shí)等待的操作讓程序停止響應(yīng),操作界面停滯讓用戶(hù)感覺(jué)起來(lái)好像死機(jī)一樣。一般會(huì)以多線程的方式處理這種需求,但若你不熟悉線程的運(yùn)行,或是想利用線程池(Thread Pool)的好處,都可以在較為耗時(shí)的操作上,采用 .NET Framework 所提供的異步功能。
一般來(lái)說(shuō)文件 I/O、網(wǎng)絡(luò)訪問(wèn)乃至于 Web Services 訪問(wèn),以及本節(jié)所討論的 DB 訪問(wèn)等都較為耗時(shí),.NET Framework為這一類(lèi)的類(lèi)都提供了上述以 Begin~/End~開(kāi)頭的非同步執(zhí)行方法,而這些方法皆成對(duì)出現(xiàn)。當(dāng)然,也有可能是自己編寫(xiě)的方法其商業(yè)邏輯非常復(fù)雜,導(dǎo)致調(diào)用該方法后,需要等待一段時(shí)間來(lái)完成,這時(shí)還可以通過(guò) .NETFramework 所提供的委托(Delegate)類(lèi)來(lái)創(chuàng)建異步運(yùn)行。
但是實(shí)際在我們的應(yīng)用中,
但我們不需要獲知DB服務(wù)器的返回信息時(shí),我們推薦使用委托,尤其是在Web開(kāi)發(fā)中。
因?yàn)樵陧?yè)面線程啟動(dòng)異步數(shù)據(jù)庫(kù)訪問(wèn)時(shí),當(dāng)頁(yè)面業(yè)務(wù)執(zhí)行完畢后仍然無(wú)法放開(kāi)訪問(wèn)數(shù)據(jù)庫(kù)的異步線程。這是我們不希望看到的,但是使用委托卻可以避免這個(gè)麻煩(webservice異步應(yīng)用中一樣如此)。
分享:揭秘ASP.NET常用的26個(gè)優(yōu)化性能方法1. 數(shù)據(jù)庫(kù)訪問(wèn)性能優(yōu)化 數(shù)據(jù)庫(kù)的連接和關(guān)閉 訪問(wèn)數(shù)據(jù)庫(kù)資源需要?jiǎng)?chuàng)建連接、打開(kāi)連接和關(guān)閉連接幾個(gè)操作。這些過(guò)程需要多次與數(shù)據(jù)庫(kù)交換信息以通過(guò)身份驗(yàn)證,比較耗費(fèi)服務(wù)器資源。ASP.
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無(wú)刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶(hù)端IP常見(jiàn)代碼存在的偽造IP問(wèn)題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(kù)(連接字符串的配置及獲取)
- asp.net頁(yè)面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè)示例代碼
- 相關(guān)鏈接:
- 教程說(shuō)明:
.Net教程-使用ADO.NET2.0提升數(shù)據(jù)交互性能(2)
。