摘要:在構建和開發(fā)基于數(shù)據(jù)庫的應用時,如何提高應用程序?qū)?shù)據(jù)庫的訪問效率和消除性能瓶頸是一個關鍵問題。文章簡要介紹了.NET框架下ADO.NET的體系結(jié)構;分析了在傳統(tǒng)情況下,采用數(shù)據(jù)集方式對數(shù)據(jù)進行讀取、插入、刪除以及更新操作存在的局限性;進而提出了一種性能優(yōu)化的思路和方法:創(chuàng)建一個通用類,通過調(diào)用這個類去實現(xiàn)對數(shù)據(jù)庫的讀取和操作。文章以Asp.net(c#)和SQL數(shù)據(jù)庫為開發(fā)平臺,用實際項目中的部分代碼驗證了改進數(shù)據(jù)訪問模式后,更能夠提高項目的開發(fā)效率以及數(shù)據(jù)庫訪問效率的目的。
關鍵詞:ADO.NET;數(shù)據(jù)庫;性能優(yōu)化;類;SQL
0 引言
互聯(lián)網(wǎng)絡技術的迅猛發(fā)展,使得人們已不再滿足簡單的通過Web來瀏覽和發(fā)布靜態(tài)信息,更多的依賴于Web的應用需求應運而生。對于過去的眾多基于共享式的數(shù)據(jù)庫應用系統(tǒng),用戶也希望能將其移植到WWW上。隨著數(shù)據(jù)庫應用的擴展和深入,其數(shù)量和規(guī)模越來越大,因此對數(shù)據(jù)庫訪問技術的要求也就越來越高。有鑒于此,本文主要探討和研究了在Web方式下,提高項目的開發(fā)效率以及數(shù)據(jù)庫訪問效率的途徑。
1 現(xiàn)狀
在Web方式下,Web客戶端是一臺只需要安裝Web瀏覽器的客戶機,Web服務器安裝的是基于超文本標記語言(HTML,Hypertext Markup Language)的服務器軟件。數(shù)據(jù)應用程序駐留在Web服務器上,最終用戶通過Web瀏覽器生成大量的數(shù)據(jù)庫應用程序。瀏覽器借助超文本傳輸協(xié)議(HTTP,HypertextTransfer Protocol)協(xié)議,通過Internet與Web服務器通信。軟件系統(tǒng)體系結(jié)構為瀏覽器/服務器結(jié)構(Browser/Server,即B/S結(jié)構),瀏覽器通過Web服務器同數(shù)據(jù)庫進行數(shù)據(jù)交互。用戶界面完全通過WWW瀏覽器實現(xiàn),一部分事務邏輯在前端實現(xiàn),但是主要事務邏輯在服務器端實現(xiàn),形成所謂3層結(jié)構(即數(shù)據(jù)層、中間層和表示層)。B/S結(jié)構,主要是利用了不斷成熟的WWW瀏覽器技術,結(jié)合瀏覽器的多種Script語言(VBScript、JavaScfipt…)和ActiveX技術,用通用瀏覽器就實現(xiàn)了原來需要復雜專用軟件才能實現(xiàn)的強大功能,并節(jié)約了開發(fā)成本,是一種全新的軟件系統(tǒng)構造技術。隨著Windows 2000/XP將瀏覽器技術植入操作系統(tǒng)內(nèi)部,這種結(jié)構更成為當今應用軟件的首選體系結(jié)構(參見圖1)。
如圖1所示,中間件(Middle Ware)負責管理Web服務器和數(shù)據(jù)庫之間的通信并提供應用程序服務,它能直接調(diào)用外部程序或腳本代碼來訪問數(shù)據(jù)庫,提供與數(shù)據(jù)庫相結(jié)合的動態(tài)HTML頁面,然后通過Web服務器返回給用戶瀏覽器。數(shù)據(jù)庫服務器負責管理駐留在數(shù)據(jù)庫服務器中的數(shù)據(jù)。
由于數(shù)據(jù)庫訪問技術發(fā)展得非???,從ODBC,JDBC,OLE DB到ADO,隨著Web交互性的日益提高和應用的日益廣泛,對于中間層的需求也越來越突出。中間層是一個邏輯層,數(shù)據(jù)訪問組件通常就在這一層上,而數(shù)據(jù)訪問組件是惟一有必要了解數(shù)據(jù)庫細節(jié)的代碼。實現(xiàn)這些要求,ADO技術是一個理想的選擇。
但是隨著應用程序開發(fā)技術的發(fā)展,Web應用程序模型越來越松散地耦合:采用可擴展標記語言(XML,ExtensibleMarkup Language),將數(shù)據(jù)編碼并在網(wǎng)絡連接間傳遞;數(shù)據(jù)庫連接通常都是斷開的;Web應用程序使用HTTP在層間進行通信,必須顯式地處理請求之間的狀態(tài)維護等。這些特點使得基于組件對象模型(COM,Component Object Model)的ADO很難在一個分布式、異種平臺構成的環(huán)境中使用記錄集,對Internet上的高度分布式環(huán)境來說它更顯得有些煩瑣或不合適。而微軟的NET架構下的ADO.NET技術正好滿足這一切。
2 ADO.NET體系結(jié)構
.NET框架是微軟公司推出的一個基于XML技術的開發(fā)分布式應用的平臺。在NET框架中,ADO.NET是ASP.NET和Windows Forms應用訪問各種數(shù)據(jù)(如RDBMS,XML文檔)的標準服務,可以使用ADO.NET訪問各種不同類型的數(shù)據(jù)源。
ADO.NET支持不同的開發(fā)需求,例如前端數(shù)據(jù)庫客戶和由應用程序、工具、語言或Internet瀏覽器使用的中間商業(yè)對象等。ADO.NET提供對Microsoft SQL Server等數(shù)據(jù)源以及通過OLE DB和XML公開的數(shù)據(jù)源的一致訪問。數(shù)據(jù)共享使用者應用程序可以使用ADO.NET來連接到這些數(shù)據(jù)源,并檢索、操作和更新數(shù)據(jù)。
ADO.NET將數(shù)據(jù)訪問分解為多個可以單獨使用或一前一后使用的不連續(xù)組件。ADO.NET包含用于連接到數(shù)據(jù)庫、執(zhí)行命令和檢索結(jié)果的.NET Framework數(shù)據(jù)提供程序,可以直接處理檢索到的結(jié)果,或?qū)⑵浞湃階DO.NET DataSet對象,以便與來自多個源的數(shù)據(jù)或在層之間進行遠程處理的數(shù)據(jù)組合在一起,以特殊方式向用戶公開。ADO.NET的DataSet對象也可以獨立于.NET Framework供程序使用,以管理應用程序的本地數(shù)據(jù)或源自XML的數(shù)據(jù)。
設計ADO.NET的目的一是為了滿足以下這一新編程模型的要求:具有斷開式數(shù)據(jù)結(jié)構;能夠與XML緊密集成;具有能夠組合來自多個不同數(shù)據(jù)源的數(shù)據(jù)的通用數(shù)據(jù)表示形式;以及具有為與數(shù)據(jù)庫交互而優(yōu)化的功能。二是為了從數(shù)據(jù)操作中分解出數(shù)據(jù)訪問。通過ADO.NET的兩個核心組件來完成此任務:DamSet和.NET Framework數(shù)據(jù)提供程序,后者是一組包括Connection,Command,DataReader和DataAdapter對象在內(nèi)的組件。ADO.NET結(jié)構如圖2所示。
Dataset是ADO.NET的斷開式結(jié)構的核心組件,是為了實現(xiàn)獨立于任何數(shù)據(jù)源的數(shù)據(jù)訪問而設計的。因此,它可以用于多種不同的數(shù)據(jù)源,用于XML數(shù)據(jù),或用于管理應用程序本地的數(shù)據(jù)。DamSet包含一個或多個DataTable對象的集合,這些對象由數(shù)據(jù)行和數(shù)據(jù)列以及主鍵、外鍵、約束和有關DataTable對象中數(shù)據(jù)的關系信息組成。
ADO.NET結(jié)構的另一個核心元素是.NET Framework數(shù)據(jù)提供程序,它是為了實現(xiàn)數(shù)據(jù)操作和對數(shù)據(jù)的快速、只進、只讀訪問而設計的。Connection對象提供與數(shù)據(jù)源的連接;Command對象使用戶能夠訪問用于返回數(shù)據(jù)、修改數(shù)據(jù)、運行存儲過程以及發(fā)送或檢索參數(shù)信息的數(shù)據(jù)庫命令;DataReader從數(shù)據(jù)源中提供高性能的數(shù)據(jù)流;DataAdapter提供連接DataSet對象和數(shù)據(jù)源的橋梁。DataAdapter使用Command對象在數(shù)據(jù)源中執(zhí)行SQL命令,以便將數(shù)據(jù)加載到DataSet中,并使對DataSet中數(shù)據(jù)的更改與數(shù)據(jù)源保持一致。
.NET Framework提供了四個.NET Framework數(shù)據(jù)提供程序:SQLServer.NET Framework數(shù)據(jù)提供程序、OLE DB.NETFramework數(shù)據(jù)提供程序、ODBC.NET Framework數(shù)據(jù)提供程序和Oracle.NET Framework數(shù)據(jù)提供程序。可以為任何數(shù)據(jù)源編寫.NET Framework數(shù)據(jù)提供程序。
3 傳統(tǒng)數(shù)據(jù)庫存取模式
作為Microsoft.NET平臺的一部分,ASP.NET提供了最簡便、最具有擴展能力的方式來開發(fā)、部署和運行可以將任何瀏覽器或設備作為目標的Web應用程序。其中,它對數(shù)據(jù)庫操作是通過數(shù)據(jù)庫訪問類ADO.NET實現(xiàn)的。利用ADO.NET提供的組件,可以方便地進行數(shù)據(jù)庫的存取。
一般在ASPNET中對數(shù)據(jù)表的操作流程為:先聲明表的結(jié)構,建立數(shù)據(jù)表,然后為每個數(shù)據(jù)表建立一個類,定義各種數(shù)據(jù)庫操作函數(shù),在應用程序中如果要對該表操作,則調(diào)用該類中增、刪、改的操作。在這種傳統(tǒng)的數(shù)據(jù)訪問模式下的數(shù)據(jù)庫操作框架圖詳見圖3。
如圖3所示,一個數(shù)據(jù)集中有一個數(shù)據(jù)表的集合。每一個表在程序中都要給出聲明,并給該表添加數(shù)據(jù)項及其類型;然后對該表建立存儲過程,編寫增加、刪除和修改函數(shù);建立存儲過程,仍然需要對該表的每個數(shù)據(jù)項聲明一個參數(shù),并注明參數(shù)類型和長度。由此可見,這樣的操作雖然結(jié)構比較清晰,但是增加了開發(fā)的工作量,而且不利于程序的維護,如果表的結(jié)構出現(xiàn)變動,則相關的多處需要被修改。
4 改進數(shù)據(jù)訪問模式
與傳統(tǒng)的方法不同,新的設計不是為每個表建立一個類,而是編寫一個通用的類來完成所有表的基本操作。改進的數(shù)據(jù)訪問模式下的基本實現(xiàn)框架圖如圖4所示。
在圖4改進的數(shù)據(jù)訪問模式中,給項目添加了一個組件類,在類中編寫公用函數(shù)代碼分別實現(xiàn)添加、更新、顯示數(shù)據(jù)庫中的單表數(shù)據(jù)。本文以asp.net(C#)和SQL SERVER 2000為開發(fā)平臺。以插入數(shù)據(jù)為例,下面將分別給出這些函數(shù)設計的部分代碼: