国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于ADO.NET的數(shù)據(jù)訪問編碼優(yōu)化

2013-06-27 05:51蔡朝暉付丹丹
關(guān)鍵詞:驅(qū)動(dòng)程序事務(wù)語句

蔡朝暉,付丹丹,蘇 丹

(大慶師范學(xué)院計(jì)算機(jī)科學(xué)與信息技術(shù)學(xué)院,黑龍江大慶163712)

基于ADO.NET的數(shù)據(jù)訪問編碼優(yōu)化

蔡朝暉,付丹丹,蘇 丹

(大慶師范學(xué)院計(jì)算機(jī)科學(xué)與信息技術(shù)學(xué)院,黑龍江大慶163712)

分析了數(shù)據(jù)庫(kù)應(yīng)用程序在運(yùn)行中出現(xiàn)的性能問題,進(jìn)而討論了基于ADO.NET的數(shù)據(jù)庫(kù)訪問技術(shù)的優(yōu)化原則,并針對(duì)具體的應(yīng)用程序設(shè)計(jì)編寫了相應(yīng)的優(yōu)化數(shù)據(jù)訪問代碼。

數(shù)據(jù)訪問;數(shù)據(jù)庫(kù)中間件;性能優(yōu)化;ADO.NET技術(shù)

0 引言

隨著計(jì)算機(jī)硬件變得更快更廉價(jià),大多數(shù)數(shù)據(jù)庫(kù)應(yīng)用程序通過網(wǎng)絡(luò)與數(shù)據(jù)庫(kù)進(jìn)行通信,而不再是直接通過單個(gè)計(jì)算機(jī)中的內(nèi)部進(jìn)程進(jìn)行通信。與此同時(shí),計(jì)算機(jī)軟件則需要提供在應(yīng)用程序和數(shù)據(jù)庫(kù)之間的連接,即所謂的數(shù)據(jù)庫(kù)中間件,因此企業(yè)出現(xiàn)了對(duì)數(shù)據(jù)庫(kù)連接標(biāo)準(zhǔn)的需求,通用的應(yīng)用程序編程接口(application programming interface,API)應(yīng)運(yùn)而生。例如ODBC(Open Database Connectivity,開放式數(shù)據(jù)庫(kù)連接)的出現(xiàn),解決了開發(fā)人員對(duì)于不同數(shù)據(jù)源Microsoft SQL Server、Oracle和IBM DB2等的數(shù)據(jù)訪問的統(tǒng)一接口問題。

隨著數(shù)據(jù)庫(kù)連接標(biāo)準(zhǔn)的出現(xiàn),數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序被添加到數(shù)據(jù)庫(kù)中間件層,即數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序處理基于標(biāo)準(zhǔn)的API函數(shù)調(diào)用,向數(shù)據(jù)庫(kù)提交SQL(Structured Query Language,結(jié)構(gòu)化查詢語言)請(qǐng)求,并向應(yīng)用程序返回結(jié)果。但同時(shí)數(shù)據(jù)訪問中間件的使用,也為應(yīng)用程序的性能問題添加了新的隱患。

目前,開發(fā)人員面臨的系統(tǒng)性能問題是:即使數(shù)據(jù)庫(kù)調(diào)試得很好,數(shù)據(jù)庫(kù)應(yīng)用程序的運(yùn)行情況卻并不總是盡如人意。其主要原因是:相比于之前處理請(qǐng)求時(shí)間大多用在DBMS(Data Base Management System,數(shù)據(jù)庫(kù)管理系統(tǒng))上,近幾年,應(yīng)用系統(tǒng)處理請(qǐng)求時(shí)間的75%~95%則花費(fèi)在了數(shù)據(jù)庫(kù)中間件上[1]。

在本文中,我們討論了基于ADO.NET(ActiveX Data Objects for the.NET)的數(shù)據(jù)庫(kù)訪問技術(shù)的優(yōu)化原則和方法,并針對(duì)具體教學(xué)項(xiàng)目案例《畢業(yè)論文管理系統(tǒng)》設(shè)計(jì)編寫了相應(yīng)的數(shù)據(jù)訪問代碼。

1 應(yīng)用程序性能問題分析

數(shù)據(jù)庫(kù)應(yīng)用程序中的性能問題,一般由于以下4個(gè)方面原因引起的[1]:

1)網(wǎng)絡(luò)通信數(shù)據(jù)包的容量設(shè)定

網(wǎng)絡(luò)常見性能問題是完成一個(gè)操作需要的往返次數(shù)。在應(yīng)用程序和數(shù)據(jù)庫(kù)之間發(fā)送的數(shù)據(jù)包數(shù)越少,意味著在數(shù)據(jù)庫(kù)和應(yīng)用程序之間的往返次數(shù)越少。

2)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序的選擇

在數(shù)據(jù)庫(kù)應(yīng)用程序部署中,選擇使用哪個(gè)驅(qū)動(dòng)程序,對(duì)性能有很大的影響。一個(gè)好的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,能夠更加高效地處理連接池和內(nèi)存管理。

3)環(huán)境配置

內(nèi)存的適時(shí)分配與釋放、服務(wù)器端與客戶端彼此操作系統(tǒng)的字節(jié)順序是否匹配等都會(huì)影響應(yīng)用程序性能;另外,在當(dāng)前虛擬化的新趨勢(shì)下,硬件資源的使用很容易達(dá)到極限,檢測(cè)產(chǎn)生硬件(內(nèi)存、磁盤I/O、CPU以及網(wǎng)絡(luò)適配器)瓶頸的原因變得更加困難。

4)數(shù)據(jù)庫(kù)應(yīng)用程序編碼不良

如果應(yīng)用程序代碼的效率不高,應(yīng)用程序向數(shù)據(jù)庫(kù)中間件發(fā)送數(shù)據(jù)請(qǐng)求的性能就會(huì)降低。例如對(duì)事務(wù)管理的提交方式,如果使用默認(rèn)的自動(dòng)提交模式就會(huì)對(duì)應(yīng)用程序造成嚴(yán)重的性能限制,因?yàn)閷?duì)于大多基于標(biāo)準(zhǔn)的應(yīng)用程序,默認(rèn)的事務(wù)模式需要數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序在每個(gè)API請(qǐng)求之后處理昂貴的Commit操作。

2 基于ADO.NET的性能優(yōu)化原則

2.1 ADO.NET概述

ADO.NET是一組用于和數(shù)據(jù)源進(jìn)行交互的面向?qū)ο箢悗?kù),用于讀寫數(shù)據(jù)庫(kù),是Microsoft希望在.NET編程環(huán)境中優(yōu)先使用的數(shù)據(jù)訪問接口。訪問過程如圖1所示。

圖1 ADO.NET數(shù)據(jù)訪問過程

2.2 ADO.NET數(shù)據(jù)訪問模式

在ADO.NET組件中包含兩個(gè)核心組件,分別是.NET Framework數(shù)據(jù)提供程序和數(shù)據(jù)集DataSet。

基于ADO.NET的客戶端應(yīng)用程序有兩種數(shù)據(jù)訪問模式,即通過DataSet對(duì)象訪問數(shù)據(jù)模式和通過DataReader對(duì)象訪問數(shù)據(jù)模式。如圖2所示。

圖2 ADO.NET數(shù)據(jù)訪問模式

ADO.NET的兩種數(shù)據(jù)訪問模式本身就為應(yīng)用程序提供了可優(yōu)化選擇:使用DataSet對(duì)象是數(shù)據(jù)集斷開式(也稱非連接式)數(shù)據(jù)訪問模式,使用DataReader對(duì)象則是連接式數(shù)據(jù)訪問模式。

其中的DataSet對(duì)象是ADO.NET技術(shù)基于ADO技術(shù)的重大變化和革新,旨在解決Web應(yīng)用程序的松耦合特性以及其在本質(zhì)上互不關(guān)聯(lián)的特性[2]。

如圖2所示,DataSet對(duì)象通過DataAdepter對(duì)象訪問數(shù)據(jù)庫(kù),它不直接對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問,從而實(shí)現(xiàn)了斷開式的數(shù)據(jù)庫(kù)訪問。DataSet對(duì)象代表數(shù)據(jù)庫(kù)的內(nèi)存緩存[2],由于其獨(dú)立于數(shù)據(jù)庫(kù),所以配合了連接池的管理方式,在數(shù)據(jù)庫(kù)連接上為系統(tǒng)性能優(yōu)化提供了保證。

2.3 ADO.NET訪問數(shù)據(jù)庫(kù)方法及步驟

(1)使用連接對(duì)象connection連接數(shù)據(jù)源;

(2)使用命令對(duì)象Command執(zhí)行SQL語句或存儲(chǔ)過程操縱數(shù)據(jù)庫(kù);

(3)使用數(shù)據(jù)讀取器對(duì)象DataReader讀取數(shù)據(jù),或者使用數(shù)據(jù)集對(duì)象DataSet和數(shù)據(jù)適配器對(duì)象DataAdapter訪問數(shù)據(jù)庫(kù)。

2.4 性能優(yōu)化通用原則

在應(yīng)用程序開發(fā)中,對(duì)ADO.NET應(yīng)用程序進(jìn)行性能優(yōu)化是一件很復(fù)雜的事情。首先,當(dāng)代碼運(yùn)行緩慢時(shí),數(shù)據(jù)提供程序是不會(huì)拋出異常進(jìn)行通知的;其次,因?yàn)椴煌瑪?shù)據(jù)提供程序之間,編程概念有一定的差異,編寫.NET應(yīng)用程序比編寫ODBC或JDBC應(yīng)用程序更復(fù)雜。

所以,所謂的性能優(yōu)化通用原則[1],是指我們所設(shè)計(jì)的數(shù)據(jù)訪問編碼,它們具體實(shí)現(xiàn)了以下4個(gè)目標(biāo)中的一個(gè)或多個(gè):

(1)降低網(wǎng)絡(luò)通信量;

(2)限制磁盤I/O;

(3)優(yōu)化應(yīng)用程序和驅(qū)動(dòng)程序之間的交互;

(4)簡(jiǎn)化查詢。

3 ADO.NET編碼優(yōu)化建議

3.1 使用連接池管理連接

數(shù)據(jù)庫(kù)連接可能需要付出較昂貴的時(shí)間和資源成本,為了緩解這個(gè)成本問題,許多數(shù)據(jù)提供者都支持連接池(Connection Pooling)。默認(rèn)情況下,ADO.NET中啟用連接池,除非以顯式形式禁用,否則,連接在應(yīng)用中打開和關(guān)閉時(shí),池進(jìn)程將對(duì)連接進(jìn)行優(yōu)化。

優(yōu)化原理[2]:連接池可以減少新連接需要打開的次數(shù)。池進(jìn)程保持物理連接的所有權(quán)。通過為每個(gè)給定的連接配置保留一組連接來管理連接。只要用戶在連接上調(diào)用Open,池進(jìn)程就會(huì)檢查池中是否有可用的連接。如果某個(gè)池連接可用,會(huì)將該連接返回給調(diào)用者,而不是打開新連接。應(yīng)用程序在該連接上調(diào)用Close時(shí),池進(jìn)程會(huì)將該連接返回到活動(dòng)連接池中,而不是真正關(guān)閉連接。連接返回到池中后,即可在下一個(gè)Open調(diào)用中使用。

3.2 使用手動(dòng)提交模式管理事務(wù)

提交或回滾事務(wù)是比較緩慢的,因?yàn)樯婕暗酱疟PI/O,同時(shí)潛在地需要大量的網(wǎng)絡(luò)往返,通常建議在應(yīng)用程序中關(guān)閉自動(dòng)提交模式,并同時(shí)使用手動(dòng)提交模式;另外,除非必須使用分布式事務(wù),否則應(yīng)使用本地事務(wù)。

優(yōu)化原理:自動(dòng)提交模式下,每次成功操作之后,數(shù)據(jù)提供程序就向數(shù)據(jù)庫(kù)發(fā)送一個(gè)提交請(qǐng)求,需要進(jìn)行一次網(wǎng)絡(luò)往返;而使用手動(dòng)提交模式,應(yīng)用程序可以控制何時(shí)提交數(shù)據(jù)庫(kù)工作,避免了不必要的事務(wù)自動(dòng)提交。至于優(yōu)先選擇本地事務(wù)模型,是由于本地事務(wù)訪問和更新位于單個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù),而分布式事務(wù)訪問和更新位于多個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù),事務(wù)須協(xié)調(diào)這些數(shù)據(jù)庫(kù)。

3.3 選擇合適的SQL語句、程序和方法

(1)選擇執(zhí)行SQL語句的Command對(duì)象方法

使用Command對(duì)象方法執(zhí)行SQL語句時(shí),有選擇地使用以下方法:ExecuteNonQuery、ExecuteReader、ExecuteScalar,可以得到最佳性能。

執(zhí)行不檢索數(shù)據(jù)的SQL語句(如Update、Insert、Delete),使用ExecuteNonQuery方法,因?yàn)榇朔椒ㄖ环祷赜绊懹涗洈?shù)量,不返回實(shí)際記錄;如果SQL語句檢索單個(gè)數(shù)值(總數(shù)或個(gè)數(shù)),使用ExecuteScalar方法,因?yàn)榇朔椒ǚ祷亟Y(jié)果集中第一條記錄的第一列。

(2)選擇使用語句或預(yù)先編譯的語句

如果正在使用只會(huì)執(zhí)行一次的SQL語句,選擇使用語句,因?yàn)樵撜Z句不會(huì)被放入語句池,這樣可以避免相應(yīng)的在池中查找該語句的負(fù)擔(dān)。當(dāng)SQL語句執(zhí)行頻率較高時(shí),建議使用預(yù)先編譯的Command對(duì)象。

(3)使用參數(shù)數(shù)組或批處理

當(dāng)更新大量數(shù)據(jù)時(shí),可以使用參數(shù)數(shù)組或SQL語句的批處理。盡管參數(shù)數(shù)組使用更多的CPU循環(huán),但是通過減少網(wǎng)絡(luò)往返次數(shù)可以提升性能。

(4)使用批量加載

如果有大量數(shù)據(jù)需要插入到數(shù)據(jù)庫(kù)表中,使用批量加載比參數(shù)數(shù)組更快。使用批量加載時(shí),記錄在一個(gè)連續(xù)的流中從數(shù)據(jù)庫(kù)客戶端發(fā)送到數(shù)據(jù)庫(kù),從而不會(huì)生成額外的網(wǎng)絡(luò)往返;此外,當(dāng)執(zhí)行批量加載時(shí),數(shù)據(jù)庫(kù)能夠優(yōu)化插入記錄的方式。但使用批量加載可能會(huì)忽略參照完整性,從而引起數(shù)據(jù)的一致性問題。

(5)使用純托管提供程序

使用純托管代碼,.NET程序集運(yùn)行于CLR(Command Language Runtime,公共語言運(yùn)行庫(kù))內(nèi)部,與數(shù)據(jù)提供程序連接到非托管代碼或在CLR外部運(yùn)行時(shí)相比,內(nèi)部調(diào)用的相關(guān)開銷會(huì)降低5%~100%。尤其是應(yīng)用程序服務(wù)器運(yùn)行繁忙時(shí),性能對(duì)比更明顯。

3.4 控制檢索數(shù)據(jù)量

(1)設(shè)計(jì)應(yīng)用程序從select列表中排除長(zhǎng)數(shù)據(jù)

通過網(wǎng)絡(luò)檢索長(zhǎng)數(shù)據(jù)速度比較慢,并且需要消耗大量的資源。而且大多用戶實(shí)際上不希望查看長(zhǎng)數(shù)據(jù)。以下列出盡量避免使用的長(zhǎng)數(shù)據(jù)類型:大XML數(shù)據(jù)、長(zhǎng)文本、長(zhǎng)二進(jìn)制數(shù)據(jù)、Clob以及Blob。

(2)限制檢索數(shù)據(jù)量

限制在驅(qū)動(dòng)程序和數(shù)據(jù)庫(kù)服務(wù)器之間的網(wǎng)絡(luò)通信量,可以通過確保select語句及其所使用where子句限制檢索返回結(jié)果的數(shù)據(jù)量;當(dāng)不能避免檢索會(huì)產(chǎn)生大量網(wǎng)絡(luò)通信量時(shí),應(yīng)用程序可以限制通過網(wǎng)絡(luò)發(fā)送的記錄數(shù)量,同時(shí)降低通過網(wǎng)絡(luò)發(fā)送的每條記錄的大小,從而控制數(shù)據(jù)庫(kù)向驅(qū)動(dòng)程序發(fā)送的數(shù)據(jù)量。

(3)選擇處理效率比較高的數(shù)據(jù)類型

處理速度從最快到最慢的數(shù)據(jù)類型:binary(二進(jìn)制),int、smallint、float(32位整數(shù)、16位整數(shù)、64位小數(shù)),decimal(十進(jìn)制),timestamp(時(shí)間戳),char(字符)。

圖3顯示了當(dāng)屬性列分別定義為64位整數(shù)類型與decimal(20)類型時(shí),每秒返回的記錄數(shù)量的比較。

圖3 不同數(shù)據(jù)類型的性能比較

4 數(shù)據(jù)訪問編碼實(shí)例及優(yōu)化分析

針對(duì)《畢業(yè)論文管理系統(tǒng)》中的“修改選題”功能,采用了上述優(yōu)化建議,規(guī)避了數(shù)據(jù)訪問中影響應(yīng)用程序性能的主要問題,設(shè)計(jì)編寫了相關(guān)的優(yōu)化測(cè)試代碼。其優(yōu)化的主要方面包括:

(1)及時(shí)關(guān)閉不使用的數(shù)據(jù)庫(kù)連接,當(dāng)然這些連接還保持在連接池中;

(2)設(shè)置管理事務(wù)的提交模式為手動(dòng)提交,其中設(shè)計(jì)相關(guān)的完整操作“修改選題”在同一事務(wù)中;

(3)使用純托管提供程序,即使用SQL Server專用的內(nèi)置.NET數(shù)據(jù)提供者對(duì)基礎(chǔ)功能進(jìn)行直接訪問;

(4)選用DataReader對(duì)象查看“論文選題”情況;

(5)選用DataSet對(duì)象完成“修改題目”操作的相關(guān)數(shù)據(jù)庫(kù)表數(shù)據(jù)的更新,并使用顯示方式更新數(shù)據(jù)。

4.1 編碼實(shí)例

//以下代碼用C#語言編寫

說明:①連接字符串中設(shè)置Integrated Security=SSPI(集成安全性)時(shí),可以使用windows身份驗(yàn)證;連接字符串中設(shè)置Connect Timeout=5,連接被銷毀前,此連接在連接池中生存的最短時(shí)間為5秒;連接字符串中設(shè)置MultipleActiveResultSets=true,為數(shù)據(jù)連接復(fù)用。

②交互操作部分代碼略去。

4.2 編碼優(yōu)化分析

(1)使用using指令引用專用內(nèi)置的.NET數(shù)據(jù)提供程序;

(2)使用try/catch塊處理連接異常,同時(shí)在finally塊中顯示關(guān)閉連接,確保及時(shí)關(guān)閉不使用的連接,避免等待垃圾收集器清除不用連接的時(shí)間,而間接影響其他連接的等待時(shí)間;

(3)使用Transaction對(duì)象處理一個(gè)功能的兩部分操作,即通過事務(wù)管理,確保數(shù)據(jù)庫(kù)的一致性和完整性。同時(shí)使用事務(wù)的顯示提交或回滾,避免了不必要的事務(wù)自動(dòng)提交;

(4)檢索大量只讀數(shù)據(jù)時(shí),選DataReader對(duì)象;(5)插入、更新或刪除數(shù)據(jù)時(shí),選用DataSet對(duì)象。

5 結(jié)語

數(shù)據(jù)庫(kù)應(yīng)用程序設(shè)計(jì)會(huì)直接影響所開發(fā)的應(yīng)用程序性能,軟件設(shè)計(jì)人員和開發(fā)人員應(yīng)特別注意這一點(diǎn)。由于為了收集數(shù)據(jù)庫(kù)的相關(guān)信息,應(yīng)用程序經(jīng)常需要通過代碼建立連接,而建立連接對(duì)性能的影響非常大,所以為了達(dá)到最好的性能,必須考慮相關(guān)的數(shù)據(jù)庫(kù)應(yīng)用程序設(shè)計(jì)。

本文編碼優(yōu)化涉及的幾個(gè)關(guān)鍵的應(yīng)用程序功能區(qū)包括:數(shù)據(jù)庫(kù)連接配置、事務(wù)提交模式、SQL語句執(zhí)行以及數(shù)據(jù)檢索設(shè)計(jì)。

[1]John Goodson,Robert A.Steward.數(shù)據(jù)訪問寶典[M].北京:清華大學(xué)出版社,2010:155-176.

[2]龔根華,王煒立.ADO.NET數(shù)據(jù)訪問技術(shù)[M].北京:清華大學(xué)出版社,2012:25-33,74-75,87-138.

[3]Shawn Eildermuth,Mark Blomsma,Jim Wightman.ADO.NET應(yīng)用程序開發(fā)[M].北京:清華大學(xué)出版社,2010:1-33,105-120.

蔡朝暉(1968-),女,黑龍江大慶人,大慶師范學(xué)院計(jì)算機(jī)科學(xué)與信息技術(shù)學(xué)院副教授,博士生,從事數(shù)據(jù)庫(kù)與知識(shí)庫(kù)研究。

大慶師范學(xué)院教學(xué)改革研究資助項(xiàng)目(JY1230)。

G642

A

2095-0063(2013)06-0026-05

2013-08-21

猜你喜歡
驅(qū)動(dòng)程序事務(wù)語句
基于分布式事務(wù)的門架數(shù)據(jù)處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
重點(diǎn):語句銜接
河湖事務(wù)
計(jì)算機(jī)硬件設(shè)備驅(qū)動(dòng)程序分析
基于OCC-DA-MCP算法的Redis并發(fā)控制
如何搞定語句銜接題
基于MPC8280的CPU單元與內(nèi)部總線驅(qū)動(dòng)程序設(shè)計(jì)
移動(dòng)實(shí)時(shí)環(huán)境下的數(shù)據(jù)一致性研究
作文語句實(shí)錄
妙用鼠標(biāo)驅(qū)動(dòng)
武邑县| 阿拉善左旗| 石泉县| 稷山县| 酒泉市| 萨嘎县| 如皋市| 和硕县| 德安县| 蒙自县| 新疆| 吴川市| 乌兰察布市| 威远县| 大兴区| 江阴市| 阳春市| 龙里县| 崇信县| 山西省| 九台市| 浮山县| 阿图什市| 施秉县| 鄄城县| 克拉玛依市| 花垣县| 肃宁县| 丘北县| 通山县| 互助| 日照市| 阿克苏市| 祁阳县| 德令哈市| 安图县| 余庆县| 岫岩| 红河县| 海口市| 海丰县|