摘要:在分析采用ADO.NET技術(shù)與LINQ技術(shù)檢索數(shù)字檔案的優(yōu)缺點(diǎn)基礎(chǔ)上,通過(guò)實(shí)驗(yàn)測(cè)試證明采用LINQ技術(shù)檢索的性能更加穩(wěn)定、優(yōu)勢(shì)更加明顯。
關(guān)鍵詞:LINQ ADO.NET 數(shù)字檔案 檢索技術(shù)
隨著檔案數(shù)字化建設(shè)的推進(jìn),數(shù)字檔案檢索的速度、效率、質(zhì)量越來(lái)越高。作為建立在現(xiàn)代信息技術(shù)普遍應(yīng)用基礎(chǔ)上的數(shù)字檔案館,以高度有序的綜合檔案信息資源為處理核心,以高速寬帶通信網(wǎng)絡(luò)為技術(shù)設(shè)施的超大規(guī)模、分布式數(shù)字化信息系統(tǒng),贏得了越來(lái)越多的檔案用戶重視。建立數(shù)字檔案檢索平臺(tái),利用最新的檢索手段為用戶提供高效便捷的檔案信息資源是數(shù)字檔案館建設(shè)的一項(xiàng)重要功能和核心工作。
一、采用ADO.NET技術(shù)檢索檔案的優(yōu)缺點(diǎn)
1.采用ADO.NET技術(shù)檢索檔案的優(yōu)點(diǎn)
當(dāng)前在數(shù)字檔案檢索中運(yùn)用微軟解決方案所用的技術(shù)主要是ADO.NET,該技術(shù)是與數(shù)據(jù)源交互的.NET技術(shù)。有許多的Data Providers,它將允許與不同的數(shù)據(jù)源交流——取決于它們所使用的協(xié)議或者數(shù)據(jù)庫(kù)。然而無(wú)論使用什么樣的Data Provider,都將使用相似的對(duì)象與數(shù)據(jù)源進(jìn)行交互①。實(shí)踐表明,ADO.NET技術(shù)在檢索系統(tǒng)里長(zhǎng)期占統(tǒng)治地位是有一定優(yōu)越性的,主要表現(xiàn)在:第一,維護(hù)方便。第二,分工明確。第三,性能優(yōu)化。第四,減少交互。
2.采用ADO.NET技術(shù)檢索檔案的缺點(diǎn)
ADO.NET在檔案檢索系統(tǒng)里還存在不夠靈活、商業(yè)邏輯層與數(shù)據(jù)庫(kù)在一起、不易移植等缺點(diǎn)。同時(shí)在檔案檢索系統(tǒng)開(kāi)發(fā)過(guò)程中,一個(gè)非常簡(jiǎn)單的功能需要若干行代碼才能完成,導(dǎo)致在設(shè)計(jì)檔案數(shù)據(jù)檢索操作時(shí),不得不考慮面向過(guò)程的思維模式來(lái)考慮檔案數(shù)據(jù)檢索工作。這與新的面向?qū)ο箝_(kāi)發(fā)需求不相符,此時(shí)需要尋求一個(gè)更好的真正實(shí)現(xiàn)面向?qū)ο箝_(kāi)發(fā)的技術(shù)。
二、采用LINQ技術(shù)檢索檔案的優(yōu)缺點(diǎn)
1.采用LINQ技術(shù)檢索檔案的優(yōu)點(diǎn)
LINQ(Language Integrated Query,語(yǔ)言集成查詢)是由微軟公司提供的一種查詢技術(shù),它最大的特點(diǎn)就是能夠把查詢功能直接引入到.NET Framework 3.5 所支持的編程語(yǔ)言(如C#、Visual Basic.NET等)中,并整合為一體,從而,查詢操作成為編程語(yǔ)言的一部分,可以像創(chuàng)建編程語(yǔ)言代碼的方法一樣,方便地創(chuàng)建查詢操作表達(dá)式②。在檔案檢索系統(tǒng)的開(kāi)發(fā)中,LINQ的優(yōu)點(diǎn)主要體現(xiàn)在以下幾方面:
第一,提高開(kāi)發(fā)效率,降低開(kāi)發(fā)成本。在LINQ To SQL正式推出之前,假如SQL語(yǔ)句寫(xiě)得有問(wèn)題,只有到運(yùn)行時(shí)才能發(fā)現(xiàn)。而LINQ To SQL 在一切圍繞數(shù)據(jù)的項(xiàng)目?jī)?nèi)都可以使用,特別是在項(xiàng)目中缺少SQL server方面的專家時(shí),其強(qiáng)大的功能可以幫助開(kāi)發(fā)人員迅速地完成項(xiàng)目③。因此,LINQ To SQL的推出,把開(kāi)發(fā)人員從煩瑣的技術(shù)細(xì)節(jié)中解脫出來(lái),從而使其更加關(guān)注項(xiàng)目的邏輯。同時(shí),LINQ To SQL的出現(xiàn),也大大降低了檔案數(shù)據(jù)庫(kù)應(yīng)用程序開(kāi)發(fā)門(mén)檻,加快了檔案數(shù)據(jù)庫(kù)應(yīng)用程序的開(kāi)發(fā)進(jìn)度。
第二,真正實(shí)現(xiàn)面向?qū)ο?,降低錯(cuò)誤檢查難度。LINQ To SQL是在ADO.NET和C#2.0的基礎(chǔ)上實(shí)現(xiàn)的。首先,它通過(guò)自動(dòng)翻譯SQL語(yǔ)句,并把結(jié)果集創(chuàng)建成對(duì)象并返回。其次,LINQ To SQL語(yǔ)句是在編譯期間做檢查,而不是在運(yùn)行時(shí)檢查。最后,LINQ To SQL是針對(duì)對(duì)象操作的,更符合今天的面向?qū)ο箝_(kāi)發(fā)思想④。
第三,開(kāi)發(fā)工具強(qiáng)力支持,擴(kuò)展功能更加豐富。在LINQ To SQL技術(shù)出現(xiàn)之前,在Java和net領(lǐng)域分別有Hibernate技術(shù)、NHibernate技術(shù)來(lái)實(shí)現(xiàn)object/relational 持久和查詢服務(wù)。與NHibernate相比,LINQ To SQL優(yōu)勢(shì)有:第一,影射代碼自動(dòng)生成。VS2008提供了SQLMetal和OR Designer兩個(gè)工具來(lái)完成此步驟。而在NHibernate中,必須通過(guò)手工寫(xiě)來(lái)完成。第二,影射代碼有更多的選擇。NHibernate只能把數(shù)據(jù)庫(kù)的信息配置在一個(gè)XML中,而LINQ To SQL有兩種方式,一是放到XML中,這稱為Externl Mapping;二是以Attribute的形式,存在于各個(gè)property中⑤。
2.采用LINQ技術(shù)實(shí)施數(shù)字檔案檢索存在的問(wèn)題
第一,LINQ是非延遲加載的,要實(shí)現(xiàn)模糊條件檢索與多條件檢索,如果要立即加載結(jié)果需要先將檢索結(jié)果轉(zhuǎn)換成List
第二,LINQ的dbml不能隨意修改,手動(dòng)更改VS2008的對(duì)象關(guān)系設(shè)計(jì)器中的dbml代碼的話,原先修改好的東西將全被覆蓋,要是需要一些特殊功能或者一些關(guān)鍵系統(tǒng)配置產(chǎn)生變化,就不得不要修改dbml代碼,這就需要對(duì)LINQ代碼相當(dāng)?shù)氖炀毲倚枰獙?duì)面向?qū)ο蟮睦斫庾銐蛏羁獭?/p>
第三,LINQ如不能很好地使用存儲(chǔ)過(guò)程,那么它的性能就會(huì)變?nèi)?,如果遇到多媒體檢索且占用大量的網(wǎng)絡(luò)資源的檢索情況,一般都需要使用存儲(chǔ)過(guò)程來(lái)解決性能問(wèn)題,這樣會(huì)給檢索的性能提高帶來(lái)不便。
三、LINQ技術(shù)與ADO.NET技術(shù)檢索檔案的性能比較
1.比較測(cè)試環(huán)境
測(cè)試環(huán)境為:CPU Intel (R) Core(TM)2 Duo T5870@2.00GHz778MHz,1.93GB的內(nèi)存,操作系統(tǒng)Windows XP SP3,測(cè)試程序是—個(gè)ASP.NET應(yīng)用程序,測(cè)試數(shù)據(jù)庫(kù)為數(shù)字化檔案數(shù)據(jù)庫(kù)。
2.測(cè)試步驟
通過(guò)測(cè)試檔案數(shù)據(jù)檢索結(jié)果,在測(cè)試時(shí)間的統(tǒng)計(jì)上采用多次測(cè)試取平均值的方式執(zhí)行,在測(cè)試過(guò)程中檔案數(shù)據(jù)量每次增加一個(gè)數(shù)量級(jí)。
3.測(cè)試過(guò)程⑥
(1)檢索0.1萬(wàn)條檔案數(shù)據(jù)性能比較。在不同時(shí)間點(diǎn)上,分別采用LINQ技術(shù)與ADO.NET技術(shù)檢索0.1萬(wàn)條檔案數(shù)據(jù),在第一個(gè)時(shí)間段,ADO.NET檢索執(zhí)行時(shí)間為0.113000 ms,LINQ檢索執(zhí)行時(shí)間為0.0450000 ms;第二個(gè)時(shí)間段,ADO.NET檢索執(zhí)行時(shí)間為0.1550000 ms,LINQ檢索執(zhí)行時(shí)間為0.0590000 ms;第三個(gè)時(shí)間段,ADO.NET檢索執(zhí)行時(shí)間為0.1210000 ms,LINQ檢索執(zhí)行時(shí)間為0.0550000 ms。這三個(gè)時(shí)間段,采用ADO.NET技術(shù)和LINQ技術(shù)檢索檔案數(shù)據(jù)的的平均時(shí)間分別為0.1296667 ms和0.0530000 ms。
(2)檢索1萬(wàn)條檔案數(shù)據(jù)性能比較。在不同時(shí)間點(diǎn)上,分別采用LINQ技術(shù)與ADO.NET技術(shù)檢索1萬(wàn)條檔案數(shù)據(jù),在第一個(gè)時(shí)間段,ADO.NET檢索執(zhí)行時(shí)間為0.1420000 ms,LINQ檢索執(zhí)行時(shí)間為0.0460000 ms;第二個(gè)時(shí)間段,ADO.NET檢索執(zhí)行時(shí)間為0.1560000 ms,LINQ檢索執(zhí)行時(shí)間為0.0420000ms;第三個(gè)時(shí)間段,ADO.NET檢索執(zhí)行時(shí)間為0.1470000ms,LINQ檢索執(zhí)行時(shí)間為0.0520000ms。這三個(gè)時(shí)間段,采用ADO.NET技術(shù)和LINQ技術(shù)檢索檔案數(shù)據(jù)的的平均時(shí)間分別為0.1483333 ms和0.0466667 ms。
(3)檢索10萬(wàn)條檔案數(shù)據(jù)性能比較。在不同時(shí)間點(diǎn)上,分別采用LINQ技術(shù)與ADO.NET技術(shù)檢索10萬(wàn)條檔案數(shù)據(jù),在第一個(gè)時(shí)間段,ADO.NET檢索執(zhí)行時(shí)間為0.1620000 ms,LINQ檢索執(zhí)行時(shí)間為0.0520000ms;第二個(gè)時(shí)間段,ADO.NET檢索執(zhí)行時(shí)間為0.1370000 ms,LINQ檢索執(zhí)行時(shí)間為0.0240000ms;第三個(gè)時(shí)間段,ADO.NET檢索執(zhí)行時(shí)間為0.1440000ms,LINQ檢索執(zhí)行時(shí)間為0.0250000ms。這三個(gè)時(shí)間段,采用ADO.NET技術(shù)和LINQ技術(shù)檢索檔案數(shù)據(jù)的的平均時(shí)間分別為0.1476667 ms和0.0336667 ms。
(4)檢索100萬(wàn)條檔案數(shù)據(jù)性能比較。在不同時(shí)間點(diǎn)上,分別采用LINQ技術(shù)與ADO.NET技術(shù)檢索100萬(wàn)條檔案數(shù)據(jù),在第一個(gè)時(shí)間段,ADO.NET檢索執(zhí)行時(shí)間為0.1530000 ms,LINQ檢索執(zhí)行時(shí)間為0.0380000ms;第二個(gè)時(shí)間段,ADO.NET檢索執(zhí)行時(shí)間為0.1710000 ms,LINQ檢索執(zhí)行時(shí)間為0.0320000ms;第三個(gè)時(shí)間段,ADO.NET檢索執(zhí)行時(shí)間為0.1760000ms,LINQ檢索執(zhí)行時(shí)間為0.0400000ms。這三個(gè)時(shí)間段,采用ADO.NET技術(shù)和LINQ技術(shù)檢索檔案數(shù)據(jù)的平均時(shí)間分別為0.1666667 ms和0.0366667 ms。
通過(guò)對(duì)以上測(cè)試數(shù)據(jù)進(jìn)行匯總,得到圖中信息:
四、結(jié)論
在4組測(cè)試的數(shù)據(jù)中,發(fā)現(xiàn)使用同一種檢索技術(shù)檢索不同量的檔案數(shù)據(jù)所用時(shí)間相差無(wú)幾,如采用ADO.NET技術(shù),檢索0.1萬(wàn)條數(shù)據(jù)的時(shí)間為0.1296667 ms,檢索100萬(wàn)條數(shù)據(jù)的時(shí)間為0.1666667 ms,甚至檢索10萬(wàn)條數(shù)據(jù)的時(shí)間比1萬(wàn)條數(shù)據(jù)的時(shí)間還略快。但是,采用LINQ技術(shù)檢索,不管在哪一組測(cè)試中,都比ADO.NET技術(shù)檢索性能好,如在0.1萬(wàn)條數(shù)據(jù)檢索中,ADO.NET技術(shù)的檢索時(shí)間是LINQ技術(shù)的2.44654倍,在100萬(wàn)條數(shù)據(jù)檢索中,ADO.NET技術(shù)的檢索時(shí)間是LINQ技術(shù)的4.54545倍。這表明在檔案數(shù)據(jù)量相同的情況下,采用LINQ技術(shù)檢索所花費(fèi)的平均時(shí)間比傳統(tǒng)ADO.NET技術(shù)檢索時(shí)間快得多,而且數(shù)據(jù)量越大檢索性能優(yōu)勢(shì)就越明顯。
因此,通過(guò)對(duì)LINQ技術(shù)檢索與ADO.NET技術(shù)檢索性能進(jìn)行比較,在測(cè)試過(guò)程中完成的是同樣檢索功能,在被檢索數(shù)據(jù)量不斷增加的情況下,ADO.NET技術(shù)實(shí)施檔案數(shù)據(jù)檢索效率有明顯的下降,檔案數(shù)據(jù)檢索時(shí)間也呈現(xiàn)明顯增加;但運(yùn)用LINQ技術(shù)檢索,在檔案數(shù)據(jù)量增加的情況下檔案檢索時(shí)間并沒(méi)有帶來(lái)明顯變化,特別是在海量檔案數(shù)據(jù)檢索中,LINQ技術(shù)顯現(xiàn)出絕對(duì)優(yōu)勢(shì)。
此外,在開(kāi)發(fā)中完成相同的檢索功能,運(yùn)用LINQ技術(shù)還可以大大減少代碼的編寫(xiě)量,提高檔案數(shù)據(jù)訪問(wèn)效率,避免系統(tǒng)在運(yùn)行過(guò)程中的注入漏洞,在代碼開(kāi)發(fā)中還可以用最少的代碼實(shí)現(xiàn)最強(qiáng)的功能,同時(shí)還能夠大大提高系統(tǒng)開(kāi)發(fā)的可擴(kuò)展性。通過(guò)對(duì)檔案檢索過(guò)程中的安全性進(jìn)行驗(yàn)證,LINQ技術(shù)檢索可以有效避免SQL注入,即使輸入中有非法字符,LINQ在處理中會(huì)將其作為一個(gè)參數(shù)來(lái)使用,保證在檔案數(shù)據(jù)檢索過(guò)程中的安全性。盡管目前在檔案檢索系統(tǒng)里,ADO.NET技術(shù)唱主角,但作為語(yǔ)言集成查詢的LINQ新技術(shù)用于檔案檢索將成為發(fā)展趨勢(shì),并逐漸顯出其強(qiáng)勁的快速、便捷功能。
注釋:
*本文為2009年“江蘇省檔案科技項(xiàng)目”(項(xiàng)目編為:2009—L15)《導(dǎo)航式檔案網(wǎng)上信息檢索方法的研究》和2007年江蘇省高校自然科學(xué)基礎(chǔ)研究面上項(xiàng)目(項(xiàng)目編號(hào)為:07KJD120234)《數(shù)字化文獻(xiàn)管理關(guān)鍵技術(shù)的研究》階段性研究成果。
①徐祥濤.基于ADO.NET數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)的研究與實(shí)現(xiàn)[J].中國(guó)新技術(shù)新產(chǎn)品,2009(17):35
② 侯利軍.精通LINQ數(shù)據(jù)訪問(wèn)技術(shù)—基于C#[M].北京:人民郵電出版社,2008:3
③宣帥. .NET平臺(tái)下MVC框架應(yīng)用研究[D]. 南京:南京航空航天大學(xué),2010: 51
④淺談Linq?To?Sql集成數(shù)據(jù)庫(kù)語(yǔ)言的優(yōu)劣[EB/OL]. [2011—11—02] http://www.bccn.net/Article/sjk/sqlserver/jszl/200709/6578.html
⑤LINQ to SQL與NHibernate橫向?qū)Ρ萚EB/OL]. [2011—11—02]http://developer.51cto.com/art/200909/153084.htm
⑥卞咸杰.基于LINQ技術(shù)的數(shù)字檔案檢索方法及應(yīng)用研究[D].無(wú)錫:江南大學(xué),2010:55-56
作者單位:鹽城師范學(xué)院