首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 連線架構用戶端深度解析 (1):API 層、OLE DB/ADO/ADO.NET、Net-Library 與共享記憶體

     編輯:關於SqlServer

連線架構分層概覽

用戶端連線堆疊由上而下:

  1. API / 物件庫層:ODBC、DB-Library、OLE DB、ADO、ADO.NET
  2. Net-Library 層:通訊協定轉換器(TCP/IP、Named Pipes、Shared Memory、VIA 等)
  3. 通訊協定層:實體網路傳輸(TCP、SMB、InfiniBand 等)
  4. 伺服器端 UMS/SOS 排程器:連線指派、工作排程

第一層:資料存取 API 與物件庫

ODBC (Open Database Connectivity)

  • C/C++ 原生 API,標準化函數呼叫(SQLConnect、SQLExecDirect)
  • SQL Server 內建工具(查詢分析器、Enterprise Manager)歷史採用 ODBC

OLE DB (Object Linking and Embedding Database)

  • COM 元件架構,提供 Provider 概念(如 SQLOLEDB、SQLNCLI、MSOLEDBSQL)
  • ADO 內部透過 OLE DB 與伺服器通訊

ADO (ActiveX Data Objects)

  • Scripting/VB6/經典 ASP 常用,物件模型:Connection、Command、Recordset
  • 連接字串範例:Provider=SQLOLEDB;Data Source=.;Initial Catalog=Northwind;UID=sa;PWD=****

ADO.NET (System.Data.SqlClient / Microsoft.Data.SqlClient)

  • .NET Framework 原生提供者,SqlConnection、SqlCommand、SqlDataReader、SqlDataAdapter
  • Managed 程式碼直接呼叫 TDS 協定,效能優於 ADO/OLE DB
  • 亦可透過 OleDbConnection (SQLOLEDB) 或 OdbcConnection 連線,但非首選

第二層:Client Net-Library (用戶端網路庫)

功能

在 API 與網路協定之間提供抽象通道,透明處理封包組裝/解裝、加密、重試邏輯。

支援協定與 DLL 對應 (SQL 2005/2008)

協定Net-Library DLL適用場景
TCP/IPdbnmpntw.dll (舊) / sqlncli.dll (新)跨網路、預設協定、防火牆友善
Named Pipesdbnmpntw.dll區域網、Windows 整合驗證、Kerberos 委派
Shared Memorydbmslpcn.dll本機連線、最高效能、繞過網路堆疊
VIA (Virtual Interface Adapter)viasso.dll高效能叢集、InfiniBand/iWARP 硬體

設定工具

  • SQL Server 2000:用戶端網路公用程式 (cliconfg.exe)
  • SQL Server 2005+:SQL Server Configuration Manager → 用戶端通訊協定

重點:共享記憶體 Net-Library

運作原理

  • 用戶端與伺服器在同一實體機器
  • 使用 Windows 記憶體對應檔 (Memory Mapped File) + 同步物件 (Mutex/Event)
  • 繞過 TCP/IP 堆疊、網卡驅動、協定處理,延遲極低

啟用方式

  • 連接字串指定 (local) 或 . 作為伺服器名稱
  • 或明確加前綴 lpc:(如 lpc:MyServer\Instance)

效能與擴展性權衡

  • 優點:延遲 ~10-50μs,吞吐量遠高於 TCP/IP 回環
  • 缺點:連線綁定單一 UMS 排程器,高併發時可能造成單一 CPU 核心瓶頸
  • 建議:本機高頻短連線(如網站連線池)優先 Shared Memory;長連線、高併發、跨 NUMA 節點考慮 TCP/IP 回環以分散排程器負載

連線指派與 UMS 排程器

  • 啟動時,SQL Server 為每個邏輯 CPU 建立一個 UMS 排程器 (SQL 2005) / SOS 排程器 (2008+)
  • 新連線指派給 目前連線數最少的排程器
  • 連線存活期間不會切換排程器(親和性)

實務含義

應用程式開啟多條連線(如連線池 100 條),若工作負載不均勻(某幾條連線處理大部分請求),會導致對應排程器 CPU 飽和,而其他排程器閒置。解決方案:

  1. 調整連線池大小與工作分配邏輯
  2. 使用 Resource Governor 限制工作組 CPU
  3. 必要時重新連線以重新指派排程器(但無法指定目標排程器)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved