熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

SQL Server 連接基礎知識

2013-11-15 14:54:37  來源: SQL Server 

  引言

  該堆棧的頂部是 API 或對象庫層應用程序通過對象庫公開的 API 函數或接口連接到 Microsoft? SQL Server用於訪問 SQL Server 的 API 示例包括 ODBC 和 DBLibrary用於訪問 SQL Server 的對象庫示例包括 OLE DBADO 和 ADONET由於 ADO 最終使用 OLE DB 與服務器通信因此 Windows 應用程序在與 SQL Server 通信時實際上只使用兩個常用的對象庫即 OLE DB 和 ADONET由於通過 ADO 或 ADONET 進行連接通常比通過 ODBC 進行連接更普遍(但 SQL Server 的查詢分析器和企業管理器仍通過 ODBC 進行連接)因此本文將從 ADO/OLE DB 和 ADONET 的角度介紹 SQL Server 連接體系結構的客戶端如今大多數應用程序均通過對象庫(而非 ODBC 或類似 API)連接到 SQL Server

  ADO 和 OLE DB

  OLE DB 客戶端(也稱作使用者)通過客戶端提供程序與服務器以及其他後端程序進行通信此提供程序是一組 COM 組件(一個或多個)用於將應用程序請求轉換為網絡進程間通信 (IPC) 請求在使用 SQL Server 的情況下最常用的 OLE DB 提供程序是 SQLOLEDB它是 Microsoft 為 SQL Server 提供的 OLE DB 提供程序SQLOLEDB 隨附於 SQL Server 中並作為 Microsoft 數據訪問組件 (MDAC) 庫的一部分安裝

  為了使用 ADO 與 SQL Server 進行通信應用程序首先使用 Connection 對象建立與服務器的連接ADO 的 Connection 對象接受一個連接字符串該字符串指定要使用的 OLE DB 提供程序以及傳遞給它的參數如果應用程序使用 SQLOLEDB 提供程序連接到 SQL Server則該字符串中將顯示SQLOLEDB

  ADO 應用程序還可以通過 ODBC 連接到 SQL Server為此應用程序將使用適用於 ODBC 的 OLE DB 提供程序並指定在其連接字符串中引用目標 SQL Server 的 ODBC 數據源這種情況下應用程序與 OLE DB 進行通信同時 ODBC 的 OLE DB 提供程序調用相應的 ODBC API以便與 SQL Server 進行會話

  ADONET

  ADONET 應用程序通常使用 NET Framework Data Provider for SQL Server 連接到 SQL Server該本機提供程序使 ADONET 對象能夠與 SQL Server 直接進行通信通常應用程序使用 SqlConnection 對象建立連接然後使用 SqlCommand 對象向服務器發送命令並接收服務器返回的結果SqlDataAdapter 和 SqlDataReader 類通常與 SqlCommand 一起使用以便通過托管的代碼應用程序與 SQL Server 進行交互

  通過 OleDbConnection 類ADONET 應用程序還可以使用 SQLOLEDB OLE DB 提供程序與 SQL Server 進行交互此外它們可以通過 OdbcConnection 類使用 ODBC 訪問 SQL Server因此僅通過托管代碼您就有三種不同的方法從應用程序訪問 SQL Server從故障排除的角度而言了解這些方法是非常有用的因為它可以幫助您將遇到的與連接相關的問題歸結到特定的數據訪問層或庫

  客戶端 NetLibrary

  該堆棧中的下一層是 NetLibraryNetLibrary 在 API 或對象庫(應用程序使用它與 SQL Server 進行通信)與網絡協議(用於與網絡交換數據)之間提供了一個通道SQL Server 為所有主要的網絡協議提供了 NetLibrary這些庫以透明方式將客戶端發出的請求發送到 SQL Server並將服務器發出的響應返回給客戶端可以使用 SQL Server 的客戶端網絡實用程序配置適用於特定客戶端的 NetLibrary支持的客戶端協議包括 TCP/IP命名管道NWLink多協議 (RPC) 和其他一些協議

  尤其值得一提的 NetLibrary 是共享內存 NetLibrary顧名思義該 NetLibrary 使用 Windows 的共享內存功能在 SQL Server 客戶端與服務器之間進行通信顯然這意味著客戶端與服務器必須位於同一台物理計算機上

  由於它能夠繞過物理網絡堆棧因此共享內存 NetLibrary 要比其他 NetLibrary 快得多對共享內存區域的訪問受到同步對象的保護因此客戶端與服務器之間的通信速度主要受限於 Windows 對內核對象進行調度的能力以及進程與共享內存區域之間進行數據復制的能力

  可以在連接時將某個時間段或(本地)指定為您的計算機名來指示使用共享內存 NetLibrary也可以在連接時為計算機\實例名加上前綴 lpc:來指示要使用共享內存 NetLibrary

  注意即使連接到同一台計算機上的 SQL Server共享內存 NetLibrary 也未必就是最佳的連接選項在某些情況下客戶端與服務器之間的直接連接可能限制它的擴展性與應用程序整體體系結構中的其他元素一樣應始終對給定技術解決方案進行全面的測試然後才能判斷它是否有良好的擴展性以及是否比其他方法更快

  連接

  客戶端進行連接時SQL Server 的用戶模式計劃程序 (UMS) 組件將它指定給特定的計劃程序啟動時SQL Server 為系統上的每個 CPU 創建一個單獨的 UMS 計劃程序當客戶端連接到服務器時這些客戶端將指定給具有最少連接數的計劃程序連接後客戶端將不會更換計劃程序 它將始終受到指定計劃程序的控制直到連接斷開

  這對與服務器建立多個連接的應用程序很重要如果應用程序性能較差或無法在它的多個連接上平均分配工作則在該應用程序的某些連接之間可能造成不必要的 CPU 資源爭用而其他連接實際上卻處於空閒狀態

  例如應用程序與雙處理器計算機上運行的 SQL Server 建立了四個連接連接 隸屬於處理器 連接 隸屬於處理器 如果應用程序的大部分工作通過連接 執行則這兩個連接將爭用 CPU 而 CPU 實際上可能仍處於空閒狀態這種情況下應用程序只能斷開某些連接或重新連接某些連接並希望連接 隸屬於不同的 CPU (連接時無法指定處理器隸屬關系)或在它的連接上重新分配工作負荷以便每個連接的工作負荷更加均衡當然後一種情況要遠好於前一種情況

  連接內存

  SQL Server 為客戶端請求的每個連接保留三個數據包緩沖區每個緩沖區的大小取決於 sp_configure 存儲過程指定的默認網絡數據包大小如果默認網絡數據包大小小於 KB則這些數據包的內存將由 SQL Server 的緩沖池提供否則該內存將由 SQL Server 的 MemToLeave 區域分配

  值得一提的是NET Framework Data Provider for SQL Server 的默認網絡數據包大小為 KB因此與托管代碼客戶端連接關聯的緩沖區通常由 SQL Server 的 MemToLeave 區域提供而典型的 ADO 應用程序卻不同它們的默認數據包大小為 KB因此緩沖區將由 SQL Server 緩沖池分配

  事件

  連接後的客戶端請求通常分為兩種廣泛類別語言事件和遠程過程調用盡管還存在其他類別但大多數由 SQL Server 客戶端發送到服務器的請求由以下兩種類型之一構成語言事件是從客戶端發送到服務器的 一組 TSQL例如如果調用 ADO Command 對象(其 CommandText 屬性設置為 TSQL 查詢CommandType 屬性設置為 adCmdText)的 Execute 方法則查詢將作為語言事件提交給服務器同樣如果將 CommandType 設置為 adCmdTable 並調用 Execute 方法則 ADO 將生成一個內部查詢(它將選擇 CommandText 屬性標識的表中的所有列)並將它作為語言事件提交給服務器另一方面如果將 CommandType 設置為 adStoredProc則調用 Execute 將使 ADO 向服務器提交一個遠程過程調用請求以執行 CommandText 屬性中列出的存儲過程

  為何要關心將請求作為語言事件還是作為 RPC 提交給服務器呢?通常這是因為 RPC 的功能更為出色特別是在重復調用具有不同篩選值的同一查詢時盡管 SQL Server 可以自動將普通的語言事件請求參數化但這種能力非常有限它從不嘗試自動將某些類型的查詢參數化這可能會導致基本相同的查詢產生不同的執行從而只因為這些不同的執行提供不同的值而導致在服務器上白白浪費計劃編譯的成本這通常不是您所希望的結果 您希望針對查詢的第一次執行編譯一個新的計劃然後將該計劃重復用於具有不同參數的執行

  而 RPC 則通過顯式參數化查詢(而不是依賴服務器參數化查詢)來支持計劃重復使用為過程的第一次執行生成一個計劃後隨後的執行將自動重復使用該計劃即使它們提供的參數值不同與通過語言事件調用存儲過程相比使用 RPC 調用存儲過程不僅節省了計劃編譯所需的執行時間和 CPU 資源還增強了 SQL Server 內存資源的利用率因為它避免了冗余執行計劃所浪費的內存

  在執行動態 TSQL 時通常首選 sp_executesql 而不是 EXEC() 也出於同樣的原因Sp_executesql 的工作方式是使用指定的查詢創建一個存儲過程然後使用提供的參數調用它與 EXEC() 不同sp_executesql 提供了一個允許您參數化動態 TSQL 並支持計劃重復使用的機制使用 sp_executesql 執行的動態查詢比使用 EXEC() 的查詢能夠在更大程度上避免不必要的編譯和資源消耗

  TDS

  從客戶端發送到 SQL Server 的 RPC語言事件和其他類型的請求被格式化為稱作表格數據流 (TDS) 的 SQL Server 特定數據格式TDS 是 SQL Server 客戶端和服務器之間使用的語言對於它的確切格式將不作介紹但是如果客戶端要與 SQL Server 進行通信就必須使用 TDS

  目前SQL Server 支持三種版本的 TDSTDS (適用於 SQL 客戶端)TDS (適用於 SQL Server 客戶端)和 TDS (適用於 SQL Server 客戶端)完全支持所有 SQL Server 功能的版本只有 TDS 其他版本保持向後兼容

  服務器端 NetLibrary

  在服務器端客戶端請求最初由 SQL Server 為偵聽特定網絡協議而建立的偵聽器接收這些偵聽器由服務器上的網絡庫以及服務器端<
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22532.html

    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.