回頭再學(xué)Asp.net系列--基礎(chǔ)篇(四)
2011-10-15 15:51 熬夜的蟲(chóng)子 閱讀(361) 評(píng)論(0) 收藏 舉報(bào)
.Net的數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)
在windows系統(tǒng)下的數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)主要有:ODBC(開(kāi)放數(shù)據(jù)庫(kù)連接),DAO(數(shù)據(jù)訪問(wèn)對(duì)象),RDO(遠(yuǎn)程數(shù)據(jù)對(duì)象),JDBC(java數(shù)據(jù)庫(kù)連接),OLE DB(對(duì)象鏈接嵌入數(shù)據(jù)庫(kù)),ADO(ActiveX數(shù)據(jù)對(duì)象),隨著微軟.net框架的推出,基于.net平臺(tái)的數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)也在原來(lái)ado的基礎(chǔ)上做出了重大的改進(jìn),升級(jí)到了全新的ado.net數(shù)據(jù)庫(kù)訪問(wèn)技術(shù),ado.net也是.net平臺(tái)上最重要的數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)。
使用 DAO 和 MFC DAO 類,可以訪問(wèn)下列數(shù)據(jù)源:
1.用數(shù)據(jù)庫(kù)引擎版本為 1.x、2.x 和 3.0 的 Microsoft Access 或 Microsoft Visual Basic 創(chuàng)建的、使用 Microsoft Jet 數(shù)據(jù)庫(kù)引擎的數(shù)據(jù)庫(kù)。
2.可安裝的 ISAM 數(shù)據(jù)庫(kù),包括: dBASE III、dBASE IV 和 dBASE 5.0;Paradox 3.x、4.x 和 5.x 版
3.開(kāi)放式數(shù)據(jù)庫(kù)連接 (ODBC) 數(shù)據(jù)庫(kù),包括但不僅限于 Microsoft SQL Server、SYBASE SQL Server 和 ORACLE Server。若要訪問(wèn) ODBC 數(shù)據(jù)庫(kù),必須具有希望訪問(wèn)的數(shù)據(jù)庫(kù)的適當(dāng) ODBC 驅(qū)動(dòng)程序。有關(guān) Visual C++ 此版本中包括的 ODBC 驅(qū)動(dòng)程序列表以及有關(guān)獲取其他驅(qū)動(dòng)程序的信息,請(qǐng)參見(jiàn) ODBC 驅(qū)動(dòng)程序列表。
4.Microsoft Excel 3.0、4.0、5.0 和 7.0 版工作表。
5.Lotus WKS、WK1、WK3 和 WK4 電子表格。
6.文本文件。
OLE DB 是用于訪問(wèn)數(shù)據(jù)的基于 COM 的應(yīng)用程序編程接口 (API)。OLE DB 支持訪問(wèn)以 OLE DB 提供程序可以使用的任何格式(數(shù)據(jù)庫(kù)、電子表格、文本文件等)存儲(chǔ)的數(shù)據(jù)。每個(gè) OLE DB 提供程序從某一特定類型的數(shù)據(jù)源(例如 SQL Server 數(shù)據(jù)庫(kù)、Microsoft Access 數(shù)據(jù)庫(kù)或 Microsoft Excel 電子表格)公開(kāi)數(shù)據(jù)。
OLE DB對(duì)ODBC的兼容性,允許OLE DB訪問(wèn)現(xiàn)有的ODBC數(shù)據(jù)源。其優(yōu)點(diǎn)很明顯,由于ODBC相對(duì)OLE DB來(lái)說(shuō)使用得更為普遍,因此可以獲得的ODBC驅(qū)動(dòng)程序相應(yīng)地要比OLE DB的要多。這樣不一定要得到OLE DB的驅(qū)動(dòng)程序,就可以立即訪問(wèn)原有的數(shù)據(jù)系統(tǒng)。
提供者位于OLE DB層,而驅(qū)動(dòng)程序位于ODBC層。
ADO.NET是微軟.NET框架的一部分,它由一組工具和層組成,應(yīng)用程序可以借此與基于文件或基于服務(wù)器的數(shù)據(jù)存儲(chǔ)很輕松地進(jìn)行通信和管理。在.NET框架中,ADO.NET類庫(kù)位于System.Data命名空間下。這些類庫(kù)包括連接到數(shù)據(jù)源、執(zhí)行命令以及在存儲(chǔ)、操作和獲取數(shù)據(jù)等功能。對(duì)于不同的應(yīng)用需要,ADO.NET設(shè)計(jì)了兩種訪問(wèn)數(shù)據(jù)庫(kù)的模式:使用DataReader對(duì)象進(jìn)行基于連接的訪問(wèn)和使用DataAdapter對(duì)象進(jìn)行的非連接的訪問(wèn)。ADO.NET與以前的數(shù)據(jù)訪問(wèn)技術(shù)相比的不同之處,就是它可以讓應(yīng)用程序與數(shù)據(jù)庫(kù)以完全非連接的數(shù)據(jù)緩存的方式來(lái)交互以實(shí)現(xiàn)離線操作數(shù)據(jù)。過(guò)去使用諸如遠(yuǎn)程數(shù)據(jù)對(duì)象(RDO)來(lái)實(shí)現(xiàn)這樣的功能,但是那只是在已有的技術(shù)上做一些修正。而ADO.NET則是基于這樣的需求從頭開(kāi)始搭建的。
Connection對(duì)象提供與數(shù)據(jù)源的連接;Command對(duì)象用于返回?cái)?shù)據(jù)、修改數(shù)據(jù)、運(yùn)行存儲(chǔ)過(guò)程以及發(fā)送或檢索參數(shù)信息的數(shù)據(jù)庫(kù)命令;DataReader從數(shù)據(jù)源中得到高性能的數(shù)據(jù)流; DataAdapter是連接DataSet對(duì)象和數(shù)據(jù)源的橋梁。
DataReader和DataSet之間的主要區(qū)別是前者的內(nèi)存開(kāi)銷要比后者更小,當(dāng)不需要在緩沖區(qū)中進(jìn)行數(shù)據(jù)修改等操作,也不需要索引隨機(jī)訪問(wèn)數(shù)據(jù)記錄時(shí),DataReader是一個(gè)更好的選擇,它能提高程序的性能。DataReader是一個(gè)一次只能讓你訪問(wèn)單行記錄信息的對(duì)象,其含義是,不管結(jié)果集的大小,用DataReader來(lái)回移動(dòng)該結(jié)果集時(shí),一次只有單行記錄加載到內(nèi)存中;另一方面,DataSet是專門為內(nèi)存緩存大量數(shù)據(jù)而設(shè)計(jì)的。
DataReader和DataSet兩種類都支持多個(gè)結(jié)果集的概念,但實(shí)現(xiàn)方式不同,DataReader通過(guò)NextResult方法來(lái)支持訪問(wèn)多個(gè)結(jié)果集,而DataSet將多個(gè)結(jié)果集加載到其中不同的DataTable對(duì)象中。
接池(Connection Pool)是連接對(duì)象的集合體,實(shí)際上是指擁有一定數(shù)量的連接對(duì)象的“緩沖存儲(chǔ)池”。連接池內(nèi)部提供一種管理機(jī)制,能控制連接池內(nèi)部邊接對(duì)象的個(gè)數(shù)、使用次數(shù)和時(shí)間,對(duì)應(yīng)用程序提供獲取和釋放連接的接口。
在需要高度并發(fā)/高度可用應(yīng)用程序中,大部分時(shí)間里用戶可能會(huì)保持一個(gè)打開(kāi)的連接,而且不是積極地使用該連接,因?yàn)橛脩粼谑褂脩?yīng)用程序的其他功能,意識(shí)到這一點(diǎn)很重要。應(yīng)用程序可以把其寶貴的資源――一個(gè)打開(kāi)的連接――從本質(zhì)上切割成時(shí)間片斷,并且在多個(gè)用戶之間來(lái)池化它。連接池在池中提供一些連接對(duì)象,對(duì)同一個(gè)數(shù)據(jù)源連接的不同請(qǐng)求可以用同一個(gè)連接對(duì)象來(lái)處理,這樣就避免了重新建立一個(gè)連接的操作。
建立連接池能顯著地提高應(yīng)用程序的性能和可伸縮性。連接池是根據(jù)每個(gè)唯一的連接字符串創(chuàng)建的,當(dāng)創(chuàng)建一個(gè)池后,將按最小池大小的要求創(chuàng)建多個(gè)連接對(duì)象并將其添加到該池中。在請(qǐng)求連接時(shí),將根據(jù)需要添加到池中,直至達(dá)到連接池上限。當(dāng)達(dá)到上限且沒(méi)有可用的連接,則該請(qǐng)求將會(huì)被排入等待隊(duì)列。當(dāng)連接被釋放回池中時(shí),連接池管理程序通過(guò)重新分配連接來(lái)滿足這些請(qǐng)求[12]。
當(dāng)請(qǐng)求SqlConnection對(duì)象時(shí),如果存在可用的連接,則將從池中獲取該對(duì)象。若要成為可用連接,該連接當(dāng)前必須未被使用,具有匹配的事務(wù)上下文或者不與任何事務(wù)上下文相關(guān)聯(lián),并且具有與服務(wù)器的有效連接。使用ADO.NET的連接池實(shí)際上是很簡(jiǎn)單的,因?yàn)槟悴⒉恍枰鍪裁炊鴥H用默認(rèn)設(shè)置就能使用連接池;相反,如果你不想使用連接池,則需要顯式地關(guān)閉它。
關(guān)閉連接:良好的應(yīng)用程序設(shè)計(jì)
連接對(duì)象必須實(shí)現(xiàn)IDisposable接口。通常,IDisposable.Dispose方法是任何對(duì)象用于清除工作的方法,當(dāng)不再需要對(duì)象時(shí),對(duì)象的使用者可以調(diào)用此方法垃圾回收器會(huì)自動(dòng)釋放分配給該對(duì)象的內(nèi)存[14]。程序員在看到這個(gè)方法時(shí)都應(yīng)知道去調(diào)用它,而在C#和VB.NET 存在諸如using代碼塊這樣的結(jié)構(gòu),能自動(dòng)調(diào)用Dispose方法。
ADO.NET連接對(duì)象完全遵循這樣的規(guī)則:它使用Dispose方法清空所有未分配的資源。除了清空未分配的資源外,Dispose方法還調(diào)用連接對(duì)象的close,使得連接可以在連接池準(zhǔn)備被重用。除了調(diào)用close外,Dispose只比Close方法多干了一點(diǎn)事情:Dispose清除了內(nèi)部集合從而清空了各種設(shè)置――諸如連接對(duì)象上的連接串,因此它可以讓垃圾收集器重用那些被具體連接對(duì)象所占用的內(nèi)存;但是,單獨(dú)調(diào)用Close方法能使實(shí)際的底層對(duì)象在連接池中變?yōu)榭芍赜谩U{(diào)用連接對(duì)象的Dispose方法可以讓我們不用再地調(diào)用連接的Close方法。它不僅確保了底層連接被池化,而且也確保了所分配的資源被垃圾收集;
![]() |
原創(chuàng)作品允許轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處以及作者信息。 作者:熬夜的蟲(chóng)子 點(diǎn)擊查看:博文索引 |

浙公網(wǎng)安備 33010602011771號(hào)