SQLServer連接基礎(chǔ)知識(shí)

字號(hào):

引言
    該堆棧的頂部是 API 或?qū)ο髱?kù)層。應(yīng)用程序通過對(duì)象庫(kù)公開的 API 函數(shù)或接口連接到 Microsoft? SQL Server。用于訪問 SQL Server 的 API 示例包括 ODBC 和 DB-Library。用于訪問 SQL Server 的對(duì)象庫(kù)示例包括 OLE DB、ADO 和 ADO.NET。由于 ADO 最終使用 OLE DB 與服務(wù)器通信,因此 Windows 應(yīng)用程序在與 SQL Server 通信時(shí)實(shí)際上只使用兩個(gè)常用的對(duì)象庫(kù),即 OLE DB 和 ADO.NET。由于通過 ADO 或 ADO.NET 進(jìn)行連接通常比通過 ODBC 進(jìn)行連接更普遍(但 SQL Server 的查詢分析器和企業(yè)管理器仍通過 ODBC 進(jìn)行連接),因此本文將從 ADO/OLE DB 和 ADO.NET 的角度介紹 SQL Server 連接體系結(jié)構(gòu)的客戶端。如今,大多數(shù)應(yīng)用程序均通過對(duì)象庫(kù)(而非 ODBC 或類似 API)連接到 SQL Server?! ?BR>    ADO 和 OLE DB
    OLE DB 客戶端(也稱作使用者)通過客戶端提供程序與服務(wù)器以及其他后端程序進(jìn)行通信。此提供程序是一組 COM 組件(一個(gè)或多個(gè)),用于將應(yīng)用程序請(qǐng)求轉(zhuǎn)換為網(wǎng)絡(luò)進(jìn)程間通信 (IPC) 請(qǐng)求。在使用 SQL Server 的情況下,最常用的 OLE DB 提供程序是 SQLOLEDB,它是 Microsoft 為 SQL Server 提供的 OLE DB 提供程序。SQLOLEDB 隨附于 SQL Server 中,并作為 Microsoft 數(shù)據(jù)訪問組件 (MDAC) 庫(kù)的一部分安裝?! ?BR>    為了使用 ADO 與 SQL Server 進(jìn)行通信,應(yīng)用程序首先使用 Connection 對(duì)象建立與服務(wù)器的連接。ADO 的 Connection 對(duì)象接受一個(gè)連接字符串,該字符串指定要使用的 OLE DB 提供程序以及傳遞給它的參數(shù)。如果應(yīng)用程序使用 SQLOLEDB 提供程序連接到 SQL Server,則該字符串中將顯示“SQLOLEDB”。  
    ADO 應(yīng)用程序還可以通過 ODBC 連接到 SQL Server。為此,應(yīng)用程序?qū)⑹褂眠m用于 ODBC 的 OLE DB 提供程序,并指定在其連接字符串中引用目標(biāo) SQL Server 的 ODBC 數(shù)據(jù)源。這種情況下,應(yīng)用程序與 OLE DB 進(jìn)行通信,同時(shí) ODBC 的 OLE DB 提供程序調(diào)用相應(yīng)的 ODBC API,以便與 SQL Server 進(jìn)行會(huì)話。   
    ADO.NET
    ADO.NET 應(yīng)用程序通常使用 .NET Framework Data Provider for SQL Server 連接到 SQL Server。該本機(jī)提供程序使 ADO.NET 對(duì)象能夠與 SQL Server 直接進(jìn)行通信。通常,應(yīng)用程序使用 SqlConnection 對(duì)象建立連接,然后使用 SqlCommand 對(duì)象向服務(wù)器發(fā)送命令,并接收服務(wù)器返回的結(jié)果。SqlDataAdapter 和 SqlDataReader 類通常與 SqlCommand 一起使用,以便通過托管的代碼應(yīng)用程序與 SQL Server 進(jìn)行交互?! ?BR>    通過 OleDbConnection 類,ADO.NET 應(yīng)用程序還可以使用 SQLOLEDB OLE DB 提供程序與 SQL Server 進(jìn)行交互。此外,它們可以通過 OdbcConnection 類使用 ODBC 訪問 SQL Server。因此,僅通過托管代碼,您就有三種不同的方法從應(yīng)用程序訪問 SQL Server。從故障排除的角度而言,了解這些方法是非常有用的,因?yàn)樗梢詭椭鷮⒂龅降呐c連接相關(guān)的問題歸結(jié)到特定的數(shù)據(jù)訪問層或庫(kù)?!?BR>    客戶端 Net-Library
    該堆棧中的下一層是 Net-Library。Net-Library 在 API 或?qū)ο髱?kù)(應(yīng)用程序使用它與 SQL Server 進(jìn)行通信)與網(wǎng)絡(luò)協(xié)議(用于與網(wǎng)絡(luò)交換數(shù)據(jù))之間提供了一個(gè)通道。SQL Server 為所有主要的網(wǎng)絡(luò)協(xié)議提供了 Net-Library。這些庫(kù)以透明方式將客戶端發(fā)出的請(qǐng)求發(fā)送到 SQL Server,并將服務(wù)器發(fā)出的響應(yīng)返回給客戶端??梢允褂?SQL Server 的客戶端網(wǎng)絡(luò)實(shí)用程序配置適用于特定客戶端的 Net-Library。支持的客戶端協(xié)議包括 TCP/IP、命名管道、NWLink、多協(xié)議 (RPC) 和其他一些協(xié)議。   
    尤其值得一提的 Net-Library 是共享內(nèi)存 Net-Library。顧名思義,該 Net-Library 使用 Windows 的共享內(nèi)存功能在 SQL Server 客戶端與服務(wù)器之間進(jìn)行通信。顯然,這意味著客戶端與服務(wù)器必須位于同一臺(tái)物理計(jì)算機(jī)上?! ?BR>    由于它能夠繞過物理網(wǎng)絡(luò)堆棧,因此共享內(nèi)存 Net-Library 要比其他 Net-Library 快得多。對(duì)共享內(nèi)存區(qū)域的訪問受到同步對(duì)象的保護(hù),因此客戶端與服務(wù)器之間的通信速度主要受限于 Windows 對(duì)內(nèi)核對(duì)象進(jìn)行調(diào)度的能力,以及進(jìn)程與共享內(nèi)存區(qū)域之間進(jìn)行數(shù)據(jù)復(fù)制的能力?! ?BR>    可以在連接時(shí)將某個(gè)時(shí)間段或(本地)指定為您的計(jì)算機(jī)名,來(lái)指示使用共享內(nèi)存 Net-Library。也可以在連接時(shí)為計(jì)算機(jī)\實(shí)例名加上前綴 lpc:,來(lái)指示要使用共享內(nèi)存 Net-Library?! ?BR>    注意,即使連接到同一臺(tái)計(jì)算機(jī)上的 SQL Server,共享內(nèi)存 Net-Library 也未必就是的連接選項(xiàng)。在某些情況下,客戶端與服務(wù)器之間的直接連接可能限制它的擴(kuò)展性。與應(yīng)用程序整體體系結(jié)構(gòu)中的其他元素一樣,應(yīng)始終對(duì)給定技術(shù)解決方案進(jìn)行全面的測(cè)試,然后才能判斷它是否有良好的擴(kuò)展性以及是否比其他方法更快。
    連接
    客戶端進(jìn)行連接時(shí),SQL Server 的用戶模式計(jì)劃程序 (UMS) 組件將它指定給特定的計(jì)劃程序。啟動(dòng)時(shí),SQL Server 為系統(tǒng)上的每個(gè) CPU 創(chuàng)建一個(gè)單獨(dú)的 UMS 計(jì)劃程序。當(dāng)客戶端連接到服務(wù)器時(shí),這些客戶端將指定給具有最少連接數(shù)的計(jì)劃程序。連接后,客戶端將不會(huì)更換計(jì)劃程序 - 它將始終受到指定計(jì)劃程序的控制,直到連接斷開?! ?BR>    這對(duì)與服務(wù)器建立多個(gè)連接的應(yīng)用程序很重要。如果應(yīng)用程序性能較差,或無(wú)法在它的多個(gè)連接上平均分配工作,則在該應(yīng)用程序的某些連接之間可能造成不必要的 CPU 資源爭(zhēng)用,而其他連接實(shí)際上卻處于空閑狀態(tài)?! ?BR>