ADO.NET 4.5中的异步与流特性
.NET 4.5為仍在選擇直接與DataReader系列類打交道的.NET開發(fā)人員帶來(lái)了一些新的異步與流特性支持。SqlDataReader允許開發(fā)人員在減少一些便利性的基礎(chǔ)上獲得更好的性能。例如,該類不管需要從服務(wù)器等待多少個(gè)數(shù)據(jù)包,通常都會(huì)一次性讀取整行。如果有多個(gè)大型對(duì)象列,SqlDataReader會(huì)將它們一次性存儲(chǔ)進(jìn)內(nèi)存中。如果你切換至順序訪問(wèn),那么將不再需要緩存整行,不過(guò)必須按照順序?qū)α羞M(jìn)行讀取。
借助.NET 4.5中的順序訪問(wèn),開發(fā)人員可以有選擇地使用NextResultAsync、ReadAsync、IsDBNullAsync與GetFieldValueAsync進(jìn)一步地調(diào)整性能。需要澄清一點(diǎn)的是,ADO.NET的異步方法不會(huì)自動(dòng)提升性能,并且對(duì)于單線程提速可能毫無(wú)作用。不過(guò),它們可以提升處理大量并發(fā)請(qǐng)求時(shí)的性能,因?yàn)樗鼈儨p少了線程阻塞。底層你需要做的是構(gòu)建Task對(duì)象,要注意這會(huì)對(duì)垃圾收集器造成壓力。一般來(lái)說(shuō),我們建議:
對(duì)于順序模式,決定是否使用GetFieldValueAsync 稍微有些復(fù)雜,Daniel Paoliello解釋說(shuō):
不管怎樣,如果你在非線性訪問(wèn)模式調(diào)用Read,或者如果你正在使用線性訪問(wèn)模式,那么決定將會(huì)非常困難,因?yàn)槟阈枰紤]從目標(biāo)列讀取多少數(shù)據(jù)以及該列包含多少數(shù)據(jù)。如果你已經(jīng)讀完了前一列,并且目標(biāo)列較小(如Boolean、DateTime或數(shù)字類型),那么你也許可以考慮使用一個(gè)同步方法。相反,如果目標(biāo)列較大(如varbinary(8000))或者你需要讀取以前的數(shù)據(jù)較多的類,那么使用一個(gè)異步方法可能會(huì)更好。最后,如果目標(biāo)列數(shù)據(jù)非常大(如varbinary(MAX)、varchar(MAX)、nvrchar(MAX)或XML),那么你應(yīng)當(dāng)取而代之考慮新的GetStream、GetTextReader和GetXmlReader方法。
當(dāng)與存儲(chǔ)在數(shù)據(jù)庫(kù)中的大文件打交道時(shí),使用基于流的方法會(huì)有一些好處。例如,你可以將流轉(zhuǎn)換至WCF或ASP.NET響應(yīng),而不用一次向?qū)⒄麄€(gè)文件讀進(jìn)內(nèi)存。這對(duì)于.NET開發(fā)人員尤為重要,因?yàn)榇髮?duì)象堆對(duì)于存儲(chǔ)碎片非常敏感。
查看英文原文:In Case You Missed It: Async and Streaming for ADO.NET 4.5
Refer:http://www.infoq.com/cn/news/2012/06/ADO-Async
轉(zhuǎn)載于:https://www.cnblogs.com/Irving/p/4364753.html
總結(jié)
以上是生活随笔為你收集整理的ADO.NET 4.5中的异步与流特性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CDN问题积累
- 下一篇: XMLHttpResponse 在项目里