摘 要: 介紹了ASP.NET中各種緩存技術(shù)的應(yīng)用程序模型,并重點(diǎn)分析了每種應(yīng)用模型的優(yōu)缺點(diǎn)及其適用范圍。
關(guān)鍵詞: ASP.NET 高速緩存 Cookie 會(huì)話狀態(tài) 應(yīng)用程序狀態(tài) 視圖狀態(tài)
隨著經(jīng)濟(jì)全球化的發(fā)展,許多公司面對(duì)客戶和市場(chǎng)需求的變化,需要構(gòu)建足夠強(qiáng)大、靈活、可伸縮的信息系統(tǒng)來(lái)支撐迅速增加的大量無(wú)規(guī)律性的訪問(wèn)和Web流量。
要開發(fā)高性能、可縮放的 Web 應(yīng)用程序,最好的方法是在首次請(qǐng)求項(xiàng)時(shí)將這些項(xiàng)存儲(chǔ)在Web服務(wù)器上或請(qǐng)求流中的其他軟件上,從而避免重新創(chuàng)建滿足先前請(qǐng)求的信息,可節(jié)省時(shí)間和資源。這就要使用數(shù)據(jù)緩存功能。ASP.NET提供了許多緩存功能。為了知道應(yīng)用程序應(yīng)該用哪一種緩存功能,需要了解將要開發(fā)的應(yīng)用程序的結(jié)構(gòu)和每種緩存功能的工作特點(diǎn)及其優(yōu)缺點(diǎn)。作者在軟件開發(fā)過(guò)程中,積累了有關(guān)這方面的一些經(jīng)驗(yàn),現(xiàn)整理出來(lái)供大家參考。
1 緩存數(shù)據(jù)的分類
在Web應(yīng)用程序中,由于變量的生命周期受限于網(wǎng)頁(yè),所以,每當(dāng).aspx文件被解釋執(zhí)行后,變量的內(nèi)容將不復(fù)存在。為將變量的內(nèi)容保存下來(lái),簡(jiǎn)單的方法是使用緩存來(lái)存儲(chǔ)變量的值。ASP.NET提供了輸出緩存和應(yīng)用程序數(shù)據(jù)緩存二種方案,用來(lái)創(chuàng)建高性能Web應(yīng)用程序的緩存類型[2]。
緩存數(shù)據(jù)按其所在網(wǎng)絡(luò)節(jié)點(diǎn)位置的不同可以分為三類[1][6]:(1)在客戶端緩存數(shù)據(jù)。(2)在Web服務(wù)器上維護(hù)緩存數(shù)據(jù)。(3)在數(shù)據(jù)庫(kù)中維護(hù)緩存數(shù)據(jù)。它是用數(shù)據(jù)庫(kù)儲(chǔ)存Web應(yīng)用程序的全局或會(huì)話數(shù)據(jù)的一種方式。
2 各種緩存技術(shù)的應(yīng)用模型
2.1 無(wú)狀態(tài)方式——不維護(hù)緩存狀態(tài)
在軟件開發(fā)中,并非必須使用緩存來(lái)保存數(shù)據(jù),完全可以通過(guò)Web應(yīng)用程序的ASP.NET代碼執(zhí)行查詢并用綁定控件將結(jié)果轉(zhuǎn)換為HTML,從而避免緩存數(shù)據(jù),使ASP.NET代碼完全是無(wú)狀態(tài)的。
(1)優(yōu)點(diǎn):由于不需要在ASP.NET代碼中緩存數(shù)據(jù),所以應(yīng)用程序的每位用戶需要的內(nèi)存是最小的。如果單純從內(nèi)存使用的角度看,這種方式最具有伸縮性。
(2)缺點(diǎn):應(yīng)用程序的性能差。假設(shè)應(yīng)用程序是一個(gè)在線目錄,則需要在所有頁(yè)上顯示產(chǎn)品目錄列表。如果每次用戶訪問(wèn)頁(yè)時(shí)都對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢以得到產(chǎn)品目錄的列表,則將浪費(fèi)寶貴的數(shù)據(jù)庫(kù)連接資源,降低系統(tǒng)的性能。
2.2 在客戶端緩存數(shù)據(jù)
這類方法通常是利用瀏覽器(如Explorer)本身固有的緩存機(jī)制來(lái)實(shí)現(xiàn)的。瀏覽器把一定時(shí)間內(nèi)用戶訪問(wèn)過(guò)的文檔或數(shù)據(jù)都存儲(chǔ)起來(lái),當(dāng)用戶重新訪問(wèn)同樣的信息時(shí)就可以從瀏覽器的緩存中取出,而不需要重新建立HTTP連接。但是,由于必須將信息發(fā)送到客戶端進(jìn)行存儲(chǔ),因此這種方式可以存儲(chǔ)的信息量存在一定的客觀限制。
2.2.1 Cookie
Cookie 用于在客戶端上存儲(chǔ)少量經(jīng)常更改的信息。許多Web站點(diǎn)用Cookie在客戶端儲(chǔ)存用戶信息,這些信息與請(qǐng)求一起發(fā)送到服務(wù)器。ASP.NET的Request和Response對(duì)象都公開一個(gè)Cookies集合,可以用它在服務(wù)器和客戶端往返行程之間儲(chǔ)存和獲取信息。
(1)優(yōu)點(diǎn):①簡(jiǎn)單。Cookie是具有簡(jiǎn)單鍵值對(duì)的、輕量的、基于文本的結(jié)構(gòu)。②可伸縮性好。不需要任何服務(wù)器資源,在客戶端儲(chǔ)存數(shù)據(jù)使ASP.NET代碼成為無(wú)狀態(tài)的,這可改進(jìn)可伸縮性。③可配置到期時(shí)間??梢酝ㄟ^(guò)設(shè)置HttpCookie對(duì)象的Expires屬性,控制Cookie的失效時(shí)間。
(2)缺點(diǎn):①儲(chǔ)存量大小受到限制。對(duì)于緩存返回許多行的查詢結(jié)果并不適用。②與瀏覽器安全設(shè)置有關(guān)。在瀏覽器的安全設(shè)置中,可以選擇允許或拒絕創(chuàng)建Cookie,如果瀏覽器選擇禁止接受任何Cookie,則拒絕用Cookie儲(chǔ)存用戶的數(shù)據(jù)。③安全性差。由于用戶可以修改在客戶端儲(chǔ)存的Cookie內(nèi)容,所以不可用來(lái)存儲(chǔ)像密碼之類的敏感信息。④持久性??蛻舳擞?jì)算機(jī)上Cookie的持久性受到客戶端Cookie到期進(jìn)程以及用戶干預(yù)的制約。
2.2.2 隱藏域
可以在頁(yè)上的隱藏域中存儲(chǔ)特定于頁(yè)的信息,方法類似于Windows窗體中的隱藏控件。ASP.NET提供HtmlInputHidden控件,該控件提供隱藏域功能。但最好使用同它功能類似的ViewState。
(1)優(yōu)點(diǎn):①簡(jiǎn)單。②可伸縮性好。無(wú)需服務(wù)器資源,隱藏域在頁(yè)上存儲(chǔ)并讀取。③與瀏覽器安全設(shè)置無(wú)關(guān)。幾乎所有瀏覽器和客戶端設(shè)備都支持具有隱藏域的窗體。
(2)缺點(diǎn):①有限的存儲(chǔ)結(jié)構(gòu)。隱藏域不支持豐富的結(jié)構(gòu),隱藏域提供在其中放置信息的單值域。②安全性差。如果直接查看頁(yè)輸出源,可以看到隱藏域中的信息,這導(dǎo)致潛在的安全性問(wèn)題。③性能降低。由于隱藏域存儲(chǔ)在頁(yè)本身,因此,如果存儲(chǔ)較大的值,則在用戶顯示頁(yè)和發(fā)送頁(yè)時(shí),頁(yè)的速度就可能會(huì)減慢。
2.2.3 視圖狀態(tài)(ViewState)
在System.Web.UI名稱空間的Page類公開了一個(gè)ViewState屬性,它包含一個(gè)類似于名稱/值對(duì)集合的StateBag對(duì)象。ASP.NET頁(yè)框架將ViewState存儲(chǔ)到一個(gè)字符串變量,將它發(fā)送到客戶端并作為隱藏變量返回。在回發(fā)時(shí),頁(yè)框架分析來(lái)自隱藏變量的輸入字符串并填充每一控件的ViewState屬性。
(1)優(yōu)點(diǎn):①可伸縮性好。②與瀏覽器安全設(shè)置無(wú)關(guān)。ViewState是在頁(yè)代碼內(nèi)結(jié)構(gòu)中的一個(gè)隱藏域中維護(hù),所以,不管瀏覽器的安全設(shè)置如何,都可以用頁(yè)面的ViewState來(lái)儲(chǔ)存和獲取數(shù)據(jù)。③儲(chǔ)存量大。頁(yè)面可以在ViewState中保存大項(xiàng)目。④頁(yè)和控件狀態(tài)自動(dòng)保持。
(2)缺點(diǎn):①安全性較低。雖然儲(chǔ)存在ViewState中的數(shù)據(jù)是散列的、壓縮的并且是為Unicode實(shí)現(xiàn)而編碼的,但用戶仍然可以解密儲(chǔ)存在頁(yè)面上的值。②性能降低。如果存儲(chǔ)較大的值,在用戶顯示頁(yè)和發(fā)送頁(yè)時(shí),頁(yè)的速度就可能會(huì)減慢。③儲(chǔ)存數(shù)據(jù)的數(shù)據(jù)類型受限制。在ViewState中,只能儲(chǔ)存ASP.NET代碼清楚如何序列化的數(shù)據(jù),如字符串和整數(shù)這樣的簡(jiǎn)單數(shù)據(jù)類型,但不能儲(chǔ)存一般對(duì)象。盡管如此,它仍然支持ISerializable接口的對(duì)象,如Dataset對(duì)象。
2.3 在Web服務(wù)器上維護(hù)緩存數(shù)據(jù)
這類方法是在Web服務(wù)器上使用內(nèi)存作為緩存空間[6]。當(dāng)服務(wù)器響應(yīng)用戶對(duì)某個(gè)數(shù)據(jù)請(qǐng)求后,在內(nèi)存緩存空間中保留一個(gè)副本,下一次如果有相同的訪問(wèn)請(qǐng)求,就直接將緩存空間中的副本提供給用戶。這可加快服務(wù)器的反應(yīng)能力和增加服務(wù)器的吞吐量。服務(wù)器端的緩存機(jī)制能夠減小用戶的訪問(wèn)延遲,與客戶端緩存相比具有更高的安全性。但可能使用更多的Web服務(wù)器資源,增加了服務(wù)器硬件和軟件的復(fù)雜度,當(dāng)在信息存儲(chǔ)量較大時(shí)限制了應(yīng)用程序的可擴(kuò)展性。
ASP.NET提供了在服務(wù)器上維護(hù)狀態(tài)管理的四種方式。
2.3.1 會(huì)話狀態(tài)(Session)
Page類公開一個(gè)Session屬性,可以在Session中存儲(chǔ)會(huì)話特定的值和對(duì)象,該Session對(duì)象將由服務(wù)器來(lái)進(jìn)行管理并可用于瀏覽器或客戶端設(shè)備。存儲(chǔ)在Session變量中的理想數(shù)據(jù)是特定于單獨(dú)會(huì)話的短期的、敏感的數(shù)據(jù),直到用戶的會(huì)話中止。
對(duì)Session的應(yīng)用,要先通過(guò)在文件Global.asax中進(jìn)行設(shè)置,然后在.aspx頁(yè)面中進(jìn)行調(diào)用。如可用下面的程序在Global.asax中加上一個(gè)Session_Start方法以定義要響應(yīng)的屬性。
void Session_Start(Object sender,EventArgs e)
{
Session.Add(″lastvalue″,0);
}
賦予屬性一個(gè)初值,這樣當(dāng)在頁(yè)面(.aspx)裝入時(shí)直接使用這個(gè)默認(rèn)值。對(duì)Session值的應(yīng)用類似于對(duì)變量的使用(如Position=(int)Session[″lastvalue″]+1;),如果用它存儲(chǔ)數(shù)據(jù)集,則必須將其從Object強(qiáng)制轉(zhuǎn)換回?cái)?shù)據(jù)集。
(1)優(yōu)點(diǎn):①易于實(shí)現(xiàn)。Session為ASP開發(fā)人員所熟悉,并且與其他.NET框架類一致。②安全性高。數(shù)據(jù)是由Web服務(wù)器而不是在瀏覽器中維護(hù)的,用戶不能通過(guò)瀏覽器來(lái)訪問(wèn)或修改Session中的內(nèi)容。③與瀏覽器安全設(shè)置無(wú)關(guān)。Session可用于不支持HTTP Cookie的瀏覽器。④獨(dú)立性好。每個(gè)用戶的會(huì)話設(shè)置是分開的,不可共享。⑤會(huì)話特定的事件。會(huì)話管理事件可以由應(yīng)用程序引發(fā)和使用。⑥持久性。放置于會(huì)話狀態(tài)變量中的數(shù)據(jù)在經(jīng)過(guò)Internet信息服務(wù)(IIS)重新啟動(dòng)和輔助進(jìn)程重新啟動(dòng)后,會(huì)話數(shù)據(jù)不會(huì)丟失。⑦平臺(tái)可縮放性。會(huì)話狀態(tài)對(duì)象可在多計(jì)算機(jī)和多進(jìn)程配置中使用,因而優(yōu)化了可縮放性方案。
(2)缺點(diǎn):①可伸縮性差。應(yīng)用程序的每個(gè)會(huì)話都要在服務(wù)器上占用一定的資源,當(dāng)有大量訪問(wèn)Web應(yīng)用程序的用戶時(shí),就應(yīng)考慮要使用的服務(wù)器資源總量。②性能降低。Session變量在被移除或替換前保留在內(nèi)存中,如果其中包含類似大型數(shù)據(jù)集的信息塊,則可能會(huì)因服務(wù)器負(fù)荷的增加而降低Web服務(wù)器的性能。
2.3.2 應(yīng)用程序狀態(tài)(Application)
ASP.NET通過(guò)HttpApplicationState類將Application提供為一種存儲(chǔ)全局應(yīng)用程序特定信息的方法。Application對(duì)象與Session對(duì)象類似,不同的是通過(guò)頁(yè)面的Application屬性取得的數(shù)據(jù)是所有會(huì)話所共享的。插入到Application變量的理想數(shù)據(jù)是那些由多個(gè)會(huì)話共享并且不經(jīng)常更改的數(shù)據(jù)。
(1)優(yōu)點(diǎn):①易于實(shí)現(xiàn)。②與瀏覽器安全設(shè)置無(wú)關(guān)。③共享性高。因?yàn)閮?chǔ)存在Application中的數(shù)據(jù)對(duì)應(yīng)用程序的所有會(huì)話都是可用的,所以它是儲(chǔ)存所有會(huì)話都能使用的穩(wěn)定性數(shù)據(jù)(如產(chǎn)品目錄列表)的理想位置。
(2)缺點(diǎn):①可伸縮性差。②持久性。因?yàn)樵贏pplication中存儲(chǔ)的全局?jǐn)?shù)據(jù)是易失的,所以如果包含這些數(shù)據(jù)的 Web服務(wù)器進(jìn)程被損壞,將丟失這些數(shù)據(jù)。③全局范圍。在Application中存儲(chǔ)的變量?jī)H對(duì)于該應(yīng)用程序正在其中運(yùn)行的特定進(jìn)程而言是全局的,并且每一應(yīng)用程序進(jìn)程可能具有不同的值。因此,不能依賴Application來(lái)存儲(chǔ)惟一值或更新網(wǎng)絡(luò)園和網(wǎng)絡(luò)場(chǎng)配置中的全局計(jì)數(shù)器。④性能降低。當(dāng)服務(wù)器負(fù)載增加時(shí),就會(huì)降低Web服務(wù)器的性能,但比在Session中維護(hù)數(shù)據(jù)的情況要好。
2.3.3 Cache
Page對(duì)象公開一個(gè)Cache屬性,可以將Cache對(duì)象想象為更健壯的Application對(duì)象。儲(chǔ)存在Cache中的數(shù)據(jù)對(duì)應(yīng)用程序的所有會(huì)話都是可用的。可以像對(duì)Application對(duì)象一樣訪問(wèn)和修改Cache對(duì)象的內(nèi)容[3]。
但在通過(guò)Add或者Insert方法向Cache添加項(xiàng)目時(shí),Cache對(duì)象還提供了下面的附加功能:
(1)可以通過(guò)提供具體值(DateTime)或者相對(duì)值(Time-
Span)來(lái)指定何時(shí)從緩存中刪除該項(xiàng)。
(2)可以指定CacheDependancy,它會(huì)在dependent項(xiàng)改變時(shí)迫使項(xiàng)從緩存中刪除。
(3)可以指定當(dāng)項(xiàng)從緩存中被刪除時(shí),ASP.NET要調(diào)用的回調(diào)函數(shù)。
使用Cache對(duì)象的優(yōu)點(diǎn)及缺點(diǎn)與Application對(duì)象的很相似,只是Cache對(duì)象還提供了額外的緩存刪除功能。
下面給出一個(gè)使用Cache存儲(chǔ)大數(shù)據(jù)的示例。在下面的Web表單中,對(duì)第一次請(qǐng)求從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù),并把它存入到應(yīng)用程序緩存。將Dataset加入緩存時(shí),設(shè)置5分鐘的到期限制,以便5分鐘內(nèi)的全部請(qǐng)求都使用緩存的Dataset。對(duì)于緩存Dataset到期之后出現(xiàn)的第一次請(qǐng)求,數(shù)據(jù)庫(kù)又會(huì)被訪問(wèn),新的Dataset開始緩存。為了證實(shí)這一觀點(diǎn),Dataset第一次被創(chuàng)建,就把“鍵—值”對(duì)加入到DataSet.ExtendedProperties集合中,這是一個(gè)能保存用戶定義的“鍵—值”對(duì)集合。用它可存儲(chǔ)Dataset生成時(shí)間,這樣就可把它顯示到頁(yè)面上。
下面的方法用于在Cache中存儲(chǔ)數(shù)據(jù)并在控件DataGrid1中顯示。
private void datasetshow( )
{/**構(gòu)建新的DataSet,并用Cache的Get的方法的結(jié)果為它賦值,該方法返回匹配指定鍵名的Object實(shí)例,并強(qiáng)制將它轉(zhuǎn)化為一個(gè)DataSet對(duì)象*/
DataSet myDataSet=(DataSet) Cache.Get(″CacheddataSet″);
if (myDataSet==null)
{//dataLocationLabel記錄DataSet所在的位置及時(shí)間
dataLocationLabel.Text=″<p>第一次來(lái)!時(shí)間是:″+
DateTime.Now.ToLongTimeString( )+″</p>″;
myDataSet=new DataSet( );
//登錄數(shù)據(jù)庫(kù)服務(wù)器并填充數(shù)據(jù)集
login(″sa″,myDataSet);
//記錄創(chuàng)建時(shí)間
myDataSet.ExtendedProperties.Add(″creattime″,
DateTime.Now.ToLongTimeString( ));
//在Cache中插入一個(gè)DataSet對(duì)象,設(shè)置5分鐘到期限制Cache.Insert(″CacheddataSet″,myDataSet,null,DateTime.Now.AddMinutes(5),TimeSpan.Zero);
}
else {
dataLocationLabel.Text=″<p>數(shù)據(jù)取自cache中,創(chuàng)建時(shí)間是:″+myDataSet.ExtendedProperties[″creattime″]+″</p>″+″<p>你這次來(lái)的時(shí)間是:″+DateTime.Now.ToLongTimeString( )+″</p>″;
}
DataGrid1.DataSource=myDataSet.Tables[″authors″];
DataGrid1.DataBind( );
}
2.3.4 輸出緩存
輸出緩存允許將動(dòng)態(tài)頁(yè)或用戶控件響應(yīng)存儲(chǔ)在輸出流(從發(fā)起服務(wù)器到請(qǐng)求瀏覽器)中任何具備HTTP 1.1緩存功能的設(shè)備上。當(dāng)后面的請(qǐng)求發(fā)生時(shí),不執(zhí)行頁(yè)或用戶控件代碼,緩存的輸出用于滿足該請(qǐng)求。
(1)優(yōu)點(diǎn):如果需要根據(jù)DataSet的內(nèi)容重復(fù)產(chǎn)生同樣的HTML,則輸出緩存就是最有效的,因?yàn)樗诜?wù)器端需要的處理更少。與Cache類似,可以控制輸出在緩存中保留的時(shí)間。
(2)缺點(diǎn):就像其他服務(wù)器端緩存功能一樣,輸出緩存仍然會(huì)消耗服務(wù)器上的資源。
2.4 在數(shù)據(jù)庫(kù)中維護(hù)狀態(tài)
當(dāng)應(yīng)用程序執(zhí)行一個(gè)非常復(fù)雜或者相當(dāng)花費(fèi)時(shí)間的查詢時(shí),可以將查詢的結(jié)果儲(chǔ)存在數(shù)據(jù)庫(kù)服務(wù)器上的一個(gè)單獨(dú)數(shù)據(jù)表中,而不是每次在用戶請(qǐng)求下一頁(yè)的結(jié)果時(shí)都要執(zhí)行這個(gè)查詢[1]。
(1)優(yōu)點(diǎn):①無(wú)狀態(tài)性。②持久性。可以根據(jù)需要在盡可能長(zhǎng)的時(shí)間內(nèi)存儲(chǔ)數(shù)據(jù)庫(kù)信息,這些信息不受Web服務(wù)器可用性的影響。③安全性高。對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)要求嚴(yán)格的身份驗(yàn)證和授權(quán),這種訪問(wèn)通常非常安全。④可伸縮性好、應(yīng)用程序的性能高。使用這種方法即使數(shù)據(jù)量很大,對(duì)應(yīng)用程序的性能影響也不會(huì)大。⑤可靠性和數(shù)據(jù)完整性。數(shù)據(jù)庫(kù)包括多種用于維護(hù)有效的功能,其中包括觸發(fā)器和引用完整性、事務(wù)等。通過(guò)在數(shù)據(jù)庫(kù)中(而不是在會(huì)話狀態(tài)等對(duì)象中)保存有關(guān)事務(wù)的信息,可方便地從錯(cuò)誤恢復(fù)。⑥可訪問(wèn)性。存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)可供多種信息處理工具訪問(wèn)。
(2)缺點(diǎn):①?gòu)?fù)雜性。使用數(shù)據(jù)庫(kù)支持狀態(tài)管理意味著更復(fù)雜的硬件和軟件配置,這比將數(shù)據(jù)儲(chǔ)存在Session、Application、Cache、ViewState或者Cookie這樣的簡(jiǎn)單對(duì)象或集合中更復(fù)雜。②性能降低。不佳的關(guān)系數(shù)據(jù)模型結(jié)構(gòu)可能導(dǎo)致擴(kuò)展問(wèn)題,對(duì)數(shù)據(jù)庫(kù)執(zhí)行過(guò)多的查詢可能會(huì)影響服務(wù)器性能。
3 結(jié)束語(yǔ)
綜上所述,對(duì)于安全性要求高的應(yīng)用程序,應(yīng)當(dāng)使用在Web服務(wù)器上維護(hù)緩存數(shù)據(jù)的方式;伸縮性要求高的應(yīng)用程序,應(yīng)當(dāng)使用在客戶端上維護(hù)緩存數(shù)據(jù)的方式。儲(chǔ)存的數(shù)據(jù)越多,加載頁(yè)面的時(shí)間越長(zhǎng),系統(tǒng)的性能就差。如果需要儲(chǔ)存大量特定于會(huì)話的數(shù)據(jù),在數(shù)據(jù)庫(kù)中儲(chǔ)存數(shù)據(jù)是一種明智的選擇。
參考文獻(xiàn)
1 Sceppa D著,梁超,張莉,賀堃譯.ADO.NET技術(shù)內(nèi)幕.北京:清華大學(xué)出版社,2003
2 McClure W B,Croft J J著,李萬(wàn)紅譯.構(gòu)建高度可伸縮的.NET數(shù)據(jù)庫(kù)應(yīng)用程序.北京:清華大學(xué)出版社,2003
3 Dickinson P著,張曉明譯.ADO.NET高級(jí)編程.北京:中國(guó)電力出版社,2003
4 劉楊.突破C#編程實(shí)例五十講.北京:中國(guó)水利水電出版社,2002
5 陳英學(xué).Microsoft ASP.NET深入編程.北京:北京希望電子出版社,2001
6 樂(lè)德廣.網(wǎng)絡(luò)緩存技術(shù)及應(yīng)用的研究.計(jì)算機(jī)系統(tǒng)應(yīng)用,2003;(5)
7 李用江.數(shù)據(jù)庫(kù)中大文本數(shù)據(jù)存取方法的探討.計(jì)算機(jī)系統(tǒng)應(yīng)用,2004;(5)