時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)
引言
該堆棧的頂部是 API 或?qū)ο髱鞂?。應用程序通過對象庫公開的 API 函數(shù)或接口連接到 Microsoft? SQL Server。用于訪問 SQL Server 的 API 示例包括 ODBC 和 DB-Library。用于訪問 SQL Server 的對象庫示例包括 OLE DB、ADO 和 ADO.NET。由于 ADO 最終使用 OLE DB 與服務器通信,因此 Windows 應用程序在與 SQL Server 通信時實際上只使用兩個常用的對象庫,即 OLE DB 和 ADO.NET。由于通過 ADO 或 ADO.NET 進行連接通常比通過 ODBC 進行連接更普遍(但 SQL Server 的查詢分析器和企業(yè)管理器仍通過 ODBC 進行連接),因此本文將從 ADO/OLE DB 和 ADO.NET 的角度介紹 SQL Server 連接體系結(jié)構(gòu)的客戶端。如今,大多數(shù)應用程序均通過對象庫(而非 ODBC 或類似 API)連接到 SQL Server?! ?/p>
ADO 和 OLE DB
OLE DB 客戶端(也稱作使用者)通過客戶端提供程序與服務器以及其他后端程序進行通信。此提供程序是一組 COM 組件(一個或多個),用于將應用程序請求轉(zhuǎn)換為網(wǎng)絡進程間通信 (IPC) 請求。在使用 SQL Server 的情況下,最常用的 OLE DB 提供程序是 SQLOLEDB,它是 Microsoft 為 SQL Server 提供的 OLE DB 提供程序。SQLOLEDB 隨附于 SQL Server 中,并作為 Microsoft 數(shù)據(jù)訪問組件 (MDAC) 庫的一部分安裝?! ?/p>
為了使用 ADO 與 SQL Server 進行通信,應用程序首先使用 Connection 對象建立與服務器的連接。ADO 的 Connection 對象接受一個連接字符串,該字符串指定要使用的 OLE DB 提供程序以及傳遞給它的參數(shù)。如果應用程序使用 SQLOLEDB 提供程序連接到 SQL Server,則該字符串中將顯示"SQLOLEDB"?! ?/p>
ADO 應用程序還可以通過 ODBC 連接到 SQL Server。為此,應用程序?qū)⑹褂眠m用于 ODBC 的 OLE DB 提供程序,并指定在其連接字符串中引用目標 SQL Server 的 ODBC 數(shù)據(jù)源。這種情況下,應用程序與 OLE DB 進行通信,同時 ODBC 的 OLE DB 提供程序調(diào)用相應的 ODBC API,以便與 SQL Server 進行會話。
ADO.NET
ADO.NET 應用程序通常使用 .NET Framework Data Provider for SQL Server 連接到 SQL Server。該本機提供程序使 ADO.NET 對象能夠與 SQL Server 直接進行通信。通常,應用程序使用 SqlConnection 對象建立連接,然后使用 SqlCommand 對象向服務器發(fā)送命令,并接收服務器返回的結(jié)果。SqlDataAdapter 和 SqlDataReader 類通常與 SqlCommand 一起使用,以便通過托管的代碼應用程序與 SQL Server 進行交互?! ?/p>
通過 OleDbConnection 類,ADO.NET 應用程序還可以使用 SQLOLEDB OLE DB 提供程序與 SQL Server 進行交互。此外,它們可以通過 OdbcConnection 類使用 ODBC 訪問 SQL Server。因此,僅通過托管代碼,您就有三種不同的方法從應用程序訪問 SQL Server。從故障排除的角度而言,了解這些方法是非常有用的,因為它可以幫助您將遇到的與連接相關(guān)的問題歸結(jié)到特定的數(shù)據(jù)訪問層或庫?!?/p>
客戶端 Net-Library
該堆棧中的下一層是 Net-Library。Net-Library 在 API 或?qū)ο髱欤☉贸绦蚴褂盟c SQL Server 進行通信)與網(wǎng)絡協(xié)議(用于與網(wǎng)絡交換數(shù)據(jù))之間提供了一個通道。SQL Server 為所有主要的網(wǎng)絡協(xié)議提供了 Net-Library。這些庫以透明方式將客戶端發(fā)出的請求發(fā)送到 SQL Server,并將服務器發(fā)出的響應返回給客戶端??梢允褂?SQL Server 的客戶端網(wǎng)絡實用程序配置適用于特定客戶端的 Net-Library。支持的客戶端協(xié)議包括 TCP/IP、命名管道、NWLink、多協(xié)議 (RPC) 和其他一些協(xié)議。
尤其值得一提的 Net-Library 是共享內(nèi)存 Net-Library。顧名思義,該 Net-Library 使用 Windows 的共享內(nèi)存功能在 SQL Server 客戶端與服務器之間進行通信。顯然,這意味著客戶端與服務器必須位于同一臺物理計算機上?! ?/p>
由于它能夠繞過物理網(wǎng)絡堆棧,因此共享內(nèi)存 Net-Library 要比其他 Net-Library 快得多。對共享內(nèi)存區(qū)域的訪問受到同步對象的保護,因此客戶端與服務器之間的通信速度主要受限于 Windows 對內(nèi)核對象進行調(diào)度的能力,以及進程與共享內(nèi)存區(qū)域之間進行數(shù)據(jù)復制的能力?! ?/p>
可以在連接時將某個時間段或(本地)指定為您的計算機名,來指示使用共享內(nèi)存 Net-Library。也可以在連接時為計算機\實例名加上前綴 lpc:,來指示要使用共享內(nèi)存 Net-Library?! ?/p>
注意,即使連接到同一臺計算機上的 SQL Server,共享內(nèi)存 Net-Library 也未必就是最佳的連接選項。在某些情況下,客戶端與服務器之間的直接連接可能限制它的擴展性。與應用程序整體體系結(jié)構(gòu)中的其他元素一樣,應始終對給定技術(shù)解決方案進行全面的測試,然后才能判斷它是否有良好的擴展性以及是否比其他方法更快。
連接
客戶端進行連接時,SQL Server 的用戶模式計劃程序 (UMS) 組件將它指定給特定的計劃程序。啟動時,SQL Server 為系統(tǒng)上的每個 CPU 創(chuàng)建一個單獨的 UMS 計劃程序。當客戶端連接到服務器時,這些客戶端將指定給具有最少連接數(shù)的計劃程序。連接后,客戶端將不會更換計劃程序 - 它將始終受到指定計劃程序的控制,直到連接斷開?! ?/p>
這對與服務器建立多個連接的應用程序很重要。如果應用程序性能較差,或無法在它的多個連接上平均分配工作,則在該應用程序的某些連接之間可能造成不必要的 CPU 資源爭用,而其他連接實際上卻處于空閑狀態(tài)。
例如,應用程序與雙處理器計算機上運行的 SQL Server 建立了四個連接,連接 1 和 3 隸屬于處理器 0,連接 2 和 4 隸屬于處理器 1。如果應用程序的大部分工作通過連接 1 和 3 執(zhí)行,則這兩個連接將爭用 CPU 0,而 CPU 1 實際上可能仍處于空閑狀態(tài)。這種情況下,應用程序只能斷開某些連接或重新連接某些連接,并希望連接 1 和 3 隸屬于不同的 CPU (連接時無法指定處理器隸屬關(guān)系),或在它的連接上重新分配工作負荷,以便每個連接的工作負荷更加均衡。當然,后一種情況要遠好于前一種情況。
連接內(nèi)存
SQL Server 為客戶端請求的每個連接保留三個數(shù)據(jù)包緩沖區(qū)。每個緩沖區(qū)的大小取決于 sp_configure 存儲過程指定的默認網(wǎng)絡數(shù)據(jù)包大小。如果默認網(wǎng)絡數(shù)據(jù)包大小小于 8 KB,則這些數(shù)據(jù)包的內(nèi)存將由 SQL Server 的緩沖池提供。否則,該內(nèi)存將由 SQL Server 的 MemToLeave 區(qū)域分配。
值得一提的是,.NET Framework Data Provider for SQL Server 的默認網(wǎng)絡數(shù)據(jù)包大小為 8KB,因此,與托管代碼客戶端連接關(guān)聯(lián)的緩沖區(qū)通常由 SQL Server 的 MemToLeave 區(qū)域提供。而典型的 ADO 應用程序卻不同,它們的默認數(shù)據(jù)包大小為 4 KB,因此緩沖區(qū)將由 SQL Server 緩沖池分配。
事件
連接后的客戶端請求通常分為兩種廣泛類別:語言事件和遠程過程調(diào)用。盡管還存在其他類別,但大多數(shù)由 SQL Server 客戶端發(fā)送到服務器的請求由以下兩種類型之一構(gòu)成:語言事件是從客戶端發(fā)送到服務器的 一組 T-SQL。例如,如果調(diào)用 ADO Command 對象(其 CommandText 屬性設置為 T-SQL 查詢,CommandType 屬性設置為 adCmdText)的 Execute 方法,則查詢將作為語言事件提交給服務器。同樣,如果將 CommandType 設置為 adCmdTable 并調(diào)用 Execute 方法,則 ADO 將生成一個內(nèi)部查詢(它將選擇 CommandText 屬性標識的表中的所有列),并將它作為語言事件提交給服務器。另一方面,如果將 CommandType 設置為 adStoredProc,則調(diào)用 Execute 將使 ADO 向服務器提交一個遠程過程調(diào)用請求,以執(zhí)行 CommandText 屬性中列出的存儲過程?! ?/p>
為何要關(guān)心將請求作為語言事件還是作為 RPC 提交給服務器呢?通常,這是因為 RPC 的功能更為出色,特別是在重復調(diào)用具有不同篩選值的同一查詢時。盡管 SQL Server 可以自動將普通的語言事件請求參數(shù)化,但這種能力非常有限。它從不嘗試自動將某些類型的查詢參數(shù)化。這可能會導致基本相同的查詢產(chǎn)生不同的執(zhí)行,從而只因為這些不同的執(zhí)行提供不同的值,而導致在服務器上白白浪費計劃編譯的成本。這通常不是您所希望的結(jié)果 - 您希望針對查詢的第一次執(zhí)行編譯一個新的計劃,然后將該計劃重復用于具有不同參數(shù)的執(zhí)行?! ?/p>
而 RPC 則通過顯式參數(shù)化查詢(而不是依賴服務器參數(shù)化查詢)來支持計劃重復使用。為過程的第一次執(zhí)行生成一個計劃后,隨后的執(zhí)行將自動重復使用該計劃,即使它們提供的參數(shù)值不同。與通過語言事件調(diào)用存儲過程相比,使用 RPC 調(diào)用存儲過程不僅節(jié)省了計劃編譯所需的執(zhí)行時間和 CPU 資源,還增強了 SQL Server 內(nèi)存資源的利用率,因為它避免了冗余執(zhí)行計劃所浪費的內(nèi)存?! ?/p>
在執(zhí)行動態(tài) T-SQL 時,通常首選 sp_executesql 而不是 EXEC() 也出于同樣的原因。Sp_executesql 的工作方式是:使用指定的查詢創(chuàng)建一個存儲過程,然后使用提供的參數(shù)調(diào)用它。與 EXEC() 不同,sp_executesql 提供了一個允許您參數(shù)化動態(tài) T-SQL 并支持計劃重復使用的機制。使用 sp_executesql 執(zhí)行的動態(tài)查詢比使用 EXEC() 的查詢能夠在更大程度上避免不必要的編譯和資源消耗。
TDS
從客戶端發(fā)送到 SQL Server 的 RPC、語言事件和其他類型的請求被格式化為稱作表格數(shù)據(jù)流 (TDS) 的 SQL Server 特定數(shù)據(jù)格式。TDS 是 SQL Server 客戶端和服務器之間使用的"語言"。對于它的確切格式將不作介紹,但是,如果客戶端要與 SQL Server 進行通信,就必須使用 TDS?! ?/p>
目前,SQL Server 支持三種版本的 TDS:TDS 8.0(適用于 SQL 2000 客戶端)、TDS 7.0(適用于 SQL Server 7.0 客戶端)和 TDS 4.2(適用于 SQL Server 4.2、6.0 和 6.5 客戶端)。完全支持所有 SQL Server 2000 功能的版
關(guān)鍵詞標簽:基礎知識,連接,SQL,Se
相關(guān)閱讀 PHP基礎知識總結(jié) 原神追想練行第六天高分攻略-原神護航穩(wěn)中求進通關(guān)陣容推薦 菜鳥入門:數(shù)據(jù)恢復的基礎知識 我的世界木制小別墅教程-我的世界生存小別墅建造 DIV+CSS網(wǎng)頁布局常用的一些基礎知識整理 linux文件系統(tǒng)基礎知識
熱門文章 淺談JSP JDBC來連接SQL Server 2005的方法 SqlServer2005對現(xiàn)有數(shù)據(jù)進行分區(qū)具體步驟 sql server系統(tǒng)表損壞的解決方法 MS-SQL2005服務器登錄名、角色、數(shù)據(jù)庫用戶、角色、架構(gòu)的關(guān)系
時間:2024-02-04 20:52:03
時間:2020-05-06 12:10:27
時間:2019-12-31 17:49:29
時間:2017-12-07 22:53:14
時間:2017-09-02 09:26:18
時間:2017-04-07 11:55:05
人氣排行 配置和注冊ODBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠程備份(還原)SQL2000數(shù)據(jù)庫 SQL2000數(shù)據(jù)庫遠程導入(導出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫服務端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級到2000的正確操作步驟 sql server系統(tǒng)表損壞的解決方法 淺談JSP JDBC來連接SQL Server 2005的方法