張志強
摘 要:在Web應(yīng)用軟件中,需要利用ADO.NET訪問數(shù)據(jù)庫中的數(shù)據(jù)。常規(guī)的數(shù)據(jù)訪問技術(shù)因訪問的數(shù)據(jù)量較大而需消耗大量的內(nèi)存空間;同時網(wǎng)絡(luò)中的傳輸數(shù)據(jù)也會因數(shù)據(jù)量大而占用過多的帶寬,從而使軟件的整體性能降低。為提高軟件性能,對常規(guī)的數(shù)據(jù)訪問技術(shù)進行優(yōu)化研究,提出并設(shè)計按頁為單位訪問數(shù)據(jù)的優(yōu)化方案。因該優(yōu)化方案每次訪問的數(shù)據(jù)量較小,從而有效地解決了上述問題,在實際應(yīng)用中有很大的意義。
關(guān)鍵詞:Web應(yīng)用軟件;ADO.NET;數(shù)據(jù)訪問技術(shù);優(yōu)化方案
中圖分類號:TP393.09文獻標(biāo)識碼:A
文章編號:1004-373X(2009)12-039-03
Optimization Research of Data Access Technology Based on Web Environment
ZHANG Zhiqiang
(College of Information Science and Technology,Chengdu University,Chengdu,610106,China)
Abstract:In Web applications,it is necessary to access database by using ADO.NET.The conventional data access technology needs to consume a large amount of memory space,because in accessing,a large amount of data is needed.At the same time,in the network,too much bandwidth can be taken up if large amounts of data are transformed,so that the software′s overall performance is lowered.To enhance the performance of software,the paper carries out an optimization research on the conventional data access technology and designs an optimization program according to the data access which takes page as the unit.As the optimization program for each access needs only a small amount of data,the above problems are effectively solved,thus the program can be expected to play an important role in practice.
Keywords:Web application software;ADO.NET;data access technology;optimization program
0 引 言
在使用ASP.NET開發(fā)Web應(yīng)用軟件的過程中,前臺客戶端經(jīng)常需要從后臺數(shù)據(jù)庫中訪問數(shù)據(jù),并在客戶端顯示與維護數(shù)據(jù)。常規(guī)的數(shù)據(jù)訪問操作是利用ADO.NET從后臺數(shù)據(jù)庫中訪問數(shù)據(jù),填充到數(shù)據(jù)集(DataSet)中的數(shù)據(jù)表(DataTable)里,并將DataTable中的數(shù)據(jù)綁定到控件(GridView)中(實際就是在網(wǎng)絡(luò)中傳輸數(shù)據(jù))。 當(dāng)多個客戶端從后臺數(shù)據(jù)庫中訪問的數(shù)據(jù)量非常大時,會使DataTable中的數(shù)據(jù)量很大,在服務(wù)器端和客戶端將消耗大量的內(nèi)存空間存放這些數(shù)據(jù);同時當(dāng)大量的數(shù)據(jù)在網(wǎng)絡(luò)中傳輸時也會占用過多的網(wǎng)絡(luò)帶寬,從而降低了整個應(yīng)用軟件的性能。為了解決上述問題,需要優(yōu)化常規(guī)的數(shù)據(jù)訪問技術(shù),減少訪問的數(shù)據(jù)量,從而提高應(yīng)用軟件的整體性能。
1 數(shù)據(jù)訪問機制
從后臺數(shù)據(jù)庫中訪問數(shù)據(jù)是利用ADO.NET數(shù)據(jù)庫訪問接口技術(shù)實現(xiàn)數(shù)據(jù)的讀寫。ADO.NET的前身是ADO(ActiveX Data Objects),它是Microsoft.NETFramework的主要數(shù)據(jù)庫訪問技術(shù),為用戶建立Web應(yīng)用軟件提供了統(tǒng)一、一致的數(shù)據(jù)庫接口。在Visual Studio.NET開發(fā)環(huán)境下,利用該技術(shù),采用C#開發(fā)語言實現(xiàn)基于Web環(huán)境的數(shù)據(jù)庫訪問操作。ADO.NET 是為基于消息的 Web 應(yīng)用軟件而設(shè)計的,通過支持對數(shù)據(jù)的松耦合訪問,可減少與數(shù)據(jù)庫的活動連接數(shù)目(即減少了多個用戶爭用數(shù)據(jù)庫服務(wù)器上的有限資源的可能性),從而實現(xiàn)最大程度的數(shù)據(jù)共享。ADO.NET 還通過對分布式應(yīng)用程序的基本對象DataSet,支持基于 XML 的持久性和傳輸格式,以實現(xiàn)最大程度的數(shù)據(jù)共享。DataSet是一種關(guān)系數(shù)據(jù)結(jié)構(gòu),使用 XML 進行訪問、寫入或序列化。ADO.NET中的DataSet使得生成要求應(yīng)用層與多個 Web 站點之間進行松耦合數(shù)據(jù)交換的應(yīng)用軟件變得很方便。
ADO.NET提供兩種數(shù)據(jù)訪問模式;一種為連接模式(Connected),與原來的ADO相兼容;另一種為非連接模式(Disconnected),這是ADO.NET中所提供的新技術(shù)。對于非連接模式,有許多優(yōu)點,可以有效地減少數(shù)據(jù)庫的連接數(shù),降低為維護數(shù)據(jù)庫的連接而帶來的開銷,從而可以提高軟件的性能和規(guī)模。因此很多數(shù)據(jù)庫的訪問操作都采用非連接模式來完成,這也是常規(guī)數(shù)據(jù)訪問技術(shù)所采取的方式。
非連接模式的數(shù)據(jù)訪問機制主要是從后臺數(shù)據(jù)庫中訪問數(shù)據(jù),并填充到DataSet中的DataTable對象里。然后將DataTable對象中的數(shù)據(jù)綁定到客戶端界面的數(shù)據(jù)表示控件上進行數(shù)據(jù)顯示與維護。常用的數(shù)據(jù)表示控件有GridView控件、DataList控件等。ADO.NET非連接模式下數(shù)據(jù)訪問操作的應(yīng)用結(jié)構(gòu)如圖1所示。
圖1 非連接模式的數(shù)據(jù)訪問機制
2 常規(guī)的數(shù)據(jù)訪問技術(shù)
如果后臺數(shù)據(jù)庫系統(tǒng)是SQL Server 2000或SQL Server 2005,常規(guī)數(shù)據(jù)訪問技術(shù)的實現(xiàn)是通過SqlDataAdapter對象執(zhí)行SQL語句來訪問數(shù)據(jù)庫中的數(shù)據(jù),并填充到DataSet中的DataTable里。最后將DataTable中的數(shù)據(jù)綁定到GridView表中顯示與維護。實現(xiàn)的代碼如下:
SqlConnection con = new SqlConnection("Data Source=zzq;Initial Catalog= keyanIN;Persist Security Info=True;User ID=sa;Password=123;Pooling=true");
//建立數(shù)據(jù)庫連接對象,數(shù)據(jù)庫為SQL Server 2005,User ID為設(shè)置登錄數(shù)據(jù)庫的用戶名,
//Password為登錄數(shù)據(jù)庫的密碼,pooling=true表示打開連接池。
string s = "select * from stu";//執(zhí)行SQL語句訪問數(shù)據(jù)
SqlDataAdapter da = new SqlDataAdapter(s,con);
DataSet ds = new DataSet( );//建立數(shù)據(jù)集對象
da.Fill(ds,"student"); //填充數(shù)據(jù)到數(shù)據(jù)表student中
GridView1.DataSource = ds.Tables["student"].DefaultView;
GridView1.DataBind( );//將數(shù)據(jù)表student的數(shù)據(jù)綁定到GridView1控件
為了保證連接字符串的安全性,在實際應(yīng)用中連接字符串不能出現(xiàn)在網(wǎng)頁程序中,其在Web.config文件中設(shè)置;然后利用代碼完成連接字符串的讀取,并建立SqlConnection連接對象。在Web.config文件中設(shè)置連接字符串的方式如下(conn為連接字符串名):
讀取連接字符串并建立連接對象的方式如下:
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
當(dāng)一頁無法顯示完數(shù)據(jù)時,需要考慮分頁技術(shù)來完成多頁的數(shù)據(jù)顯示,采用的方法很多,例如:利用GridView控件的自動分頁技術(shù)完成分頁操作。以這種常規(guī)技術(shù)訪問數(shù)據(jù)時,當(dāng)訪問的數(shù)據(jù)量很大時,DataTable中的數(shù)據(jù)會很多,需要更多的內(nèi)存空間來存儲數(shù)據(jù);將DataTable中的數(shù)據(jù)綁定到控件中顯示時,因傳輸大量數(shù)據(jù)而占用更多的網(wǎng)絡(luò)帶寬,從而使系統(tǒng)的整體性能降低。要改變這種狀況,采用優(yōu)化的數(shù)據(jù)訪問技術(shù),降低每次從數(shù)據(jù)庫中訪問的數(shù)據(jù)量,從而可有效地降低內(nèi)存空間的消耗和所占網(wǎng)絡(luò)的帶寬。
3 優(yōu)化的數(shù)據(jù)訪問技術(shù)
優(yōu)化訪問技術(shù)的主要目的是降低從數(shù)據(jù)庫中訪問的數(shù)據(jù)量。按頁為單位訪問數(shù)據(jù)庫中的數(shù)據(jù)是一個很有效的方案。其訪問的數(shù)據(jù)量遠遠小于訪問所有數(shù)據(jù)的數(shù)據(jù)量。每頁的數(shù)據(jù)量可以動態(tài)地進行調(diào)整,以適應(yīng)實際的需求。實現(xiàn)優(yōu)化技術(shù),需要進行2步操作,第一,確定整個數(shù)據(jù)量的頁數(shù),以及每頁的數(shù)據(jù)索引范圍;第二,修改訪問數(shù)據(jù)的SQL 語句,以每頁的數(shù)據(jù)索引范圍為單位訪問數(shù)據(jù)。這樣就可以實現(xiàn)只訪問每頁指定范圍的需求數(shù)據(jù),而不是訪問所有的需求數(shù)據(jù)。實現(xiàn)原理如圖2所示。
圖2 優(yōu)化的數(shù)據(jù)訪問
下面用一個實例實現(xiàn)優(yōu)化方案。數(shù)據(jù)庫系統(tǒng)采用SQL Server 2005,數(shù)據(jù)庫中有3個數(shù)據(jù)表Unit,Employeer,keyan,分別為學(xué)校部門表、員工表、員工科研信息表。按職工姓名查詢其所有科研信息。實現(xiàn)的界面設(shè)計如圖3所示。
圖3 界面設(shè)計
3.1 分頁技術(shù)的實現(xiàn)
3.1.1 數(shù)據(jù)記錄的獲取
為了計算數(shù)據(jù)總頁數(shù),需獲取數(shù)據(jù)記錄的總數(shù),因此設(shè)計GetOrdersCount方法,以實現(xiàn)數(shù)據(jù)記錄總數(shù)的獲取。在該方法中,以員工姓名name作為動態(tài)參數(shù)進行動態(tài)查詢,并利用SQL語句中的count聚合函數(shù)獲取數(shù)據(jù)記錄總數(shù)。
public virtual int GetOrdersCount(string qury )
{ Database d = new Database();
string k;
k = "select count(Unit.Unit_Name) from Employeer,Unit,keyan where Employeer.Unit_ID=Unit.Unit_ID and Employeer.Employeer_ID=keyan.Employeer_ID and Employeer.Employeer_Name=@name";//設(shè)計的SQL語句
SqlConnection conn = … //利用前述的技術(shù)創(chuàng)建連接對象
conn.Open( );//打開連接
SqlCommand cmd = new SqlCommand(k,conn);
cmd.Parameters.Add("@name",SqlDbType.NVarChar,10);
cmd.Parameters["@name"].Value = qury;
//創(chuàng)建了帶參數(shù)查詢的命令對象,以name為查詢參數(shù),qury為具體的查詢值
return (int)cmd.ExecuteScalar();//返回查詢的記錄條數(shù)
}
3.1.2 頁數(shù)的計算
通過執(zhí)行GetOrdersCount方法獲取數(shù)據(jù)記錄總數(shù),并設(shè)置每頁訪問的數(shù)據(jù)量(假設(shè)每頁訪問10條記錄,每頁的記錄數(shù)可以根據(jù)需求進行更改),從而計算出數(shù)據(jù)總頁數(shù)。計算總頁數(shù)的實現(xiàn)代碼如下所示。
int count = this.GetOrdersCount(qury);// qury為具體的查詢值
int PagesCount = count / 10; // PagesCount為總頁數(shù)
int temp = count % 10;
if (temp != 0)
PagesCount++; //最后一頁不足10條記錄,任然為一頁累加到總頁數(shù)中
3.2 數(shù)據(jù)訪問技術(shù)的優(yōu)化實現(xiàn)
3.2.1 數(shù)據(jù)訪問的優(yōu)化設(shè)計
在數(shù)據(jù)訪問層的設(shè)計中,由GetData方法實現(xiàn)以頁為單位的數(shù)據(jù)訪問;該方法根據(jù)數(shù)據(jù)索引范圍對數(shù)據(jù)庫進行訪問,從而極大地減少了服務(wù)器與客戶機之間傳送的數(shù)據(jù)流量。數(shù)據(jù)索引范圍由起始索引號和終止索引號組成,其中起始索引號由頁號確定;終止索引號=起始索引號+每頁數(shù)據(jù)記錄條數(shù)。在GetData方法中,以參數(shù)startRowIndex為指定的起始索引號,以參數(shù)maximumRows為每頁數(shù)據(jù)記錄條數(shù)進行SQL語句的優(yōu)化設(shè)計,通過執(zhí)行優(yōu)化的SQL語句,完成指定范圍的數(shù)據(jù)訪問。
public DataView GetData(int startRowIndex,int maximumRows,string sortExpression,string qury)
{ //查詢指定索引范圍的數(shù)據(jù),startRowIndex為起始索引號,maximumRows為查詢的記錄條數(shù) ,sortExpression為對結(jié)果的排序條件,qury為查詢值。
string sql = @"with keyanTable as
(select Unit.Unit_Name,Employeer.Employeer_Name,Employeer.Employeer_Degree,Employeer.Employeer_zhicheng,keyan.Keyan_content,keyan.keyan_class,keyan.Declare_time,ROW_NUMBER() OVER(ORDER BY {0}) as RowNumber
from Employeer,Unit,keyan where Employeer.Unit_ID = Unit.Unit_ID and Employeer.Employeer_ID = keyan.Employeer_ID )
select * from keyanTable where RowNumber > {1} and RowNumber <= {2} and keyanTable.Employeer_Name = ‘{3};"; //優(yōu)化后的SQL語句
if (string.IsNullOrEmpty(sortExpression))
sortExpression = "Employeer.Employeer_ID ASC";
sql = string.Format(sql,sortExpression,startRowIndex,startRowIndex + maximumRows,qury);
// startRowIndex起始索引號;startRowIndex + maximumRows為終止索引號
SqlConnection conn = ……//利用前述的技術(shù)創(chuàng)建連接對象
SqlDataAdapter da = new SqlDataAdapter(sql,conn);
DataSet ds = new DataSet();
da.Fill(ds,”Information”);
return ds.Tables[“Information”].DefaultView;//返回數(shù)據(jù)視圖
}
3.2.2 表示層的設(shè)計
在客戶端,根據(jù)指定頁確定數(shù)據(jù)索引范圍的起始索引號,起始索引號通過公式:this.GetData(int.Parse(lb2.Text)×10-10計算得出。其中,int.Parse(lb2.Text)為客戶端指定的頁號,10為每頁的記錄數(shù);每頁的數(shù)據(jù)訪問量以每頁的記錄條數(shù)為標(biāo)準(zhǔn)。 將動態(tài)生成的數(shù)據(jù)索引范圍作為參數(shù)執(zhí)行GetData方法,實現(xiàn)按照指定頁的數(shù)據(jù)索引范圍訪問數(shù)據(jù)。
…
string qurystr = TextBox8.Text.Trim();//獲取界面上的查詢值
DataView dv = this.GetData(int.Parse(lb2.Text) * 10 - 10,10,"Employeer.Employeer_ID DESC",qurystr);
// lb2.Text為訪問的頁號值 ,10為每頁的訪問的記錄數(shù)
GridView1.DataSource = dv;
GridView1.DataBind( );
4 結(jié) 語
對數(shù)據(jù)訪問技術(shù)進行優(yōu)化后,降低了對后臺數(shù)據(jù)庫的訪問數(shù)據(jù)量,進而減少了所占內(nèi)存空間的大小,降低了在網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)量。該優(yōu)化方案提高了Web應(yīng)用軟件運行的性能,在實際使用時有很大的意義。
參考文獻
[1]陳建國.開發(fā)高性能ADO.NET應(yīng)用程序的探討[J].福建電腦,2007(1):177-178.
[2][美]Glenn Johnson.ADO.NET 2.0高級編程[M].段超,譯.北京:清華大學(xué)出版社,2006.
[3]陳永強.SQL Server 2005 Web應(yīng)用開發(fā)[M].北京:清華大學(xué)出版社,2008.
[4]王強,滕剛.微軟培訓(xùn)教材[Z].2008.
[5]李昕,常革新,崔杰.基于ADO.NET的ASP.NET頁面程序[J].遼寧工程技術(shù)大學(xué)學(xué)報:自然科學(xué)版,2006,25(2):250-252.
[6]王磊.基于.NET平臺的數(shù)據(jù)庫訪問技術(shù)[J].福建電腦,2006(12):75-89.
[7]孔延香,李永忠,郭秀峰.ADO.NET數(shù)據(jù)庫訪問技術(shù)研究與實現(xiàn)[J].現(xiàn)代電子技術(shù),2005,28(16):51-52,59.
[8]林平榮.ADO.NET的數(shù)據(jù)庫訪問技術(shù)研究與實現(xiàn)[J].電腦知識與技術(shù),2008,7(1):1 198-1 201.
[9]劉瑩.基于的ADO.NET數(shù)據(jù)庫訪問技術(shù)研究[J].電腦知識與技術(shù),2008,18(2):1 580-1 582.
[10]陳平,池同柱.ADO.NET數(shù)據(jù)訪問模式選擇及優(yōu)化[J].福建電腦,2007(7):80,72.