資源管理是構建可擴展客戶端與 Web 應用的關鍵。Microsoft XML for Analysis Provider (msxaserv.dll) 內建連接池機制,透過 ADOConPool (管理 ADO 連線) 與 OLEDBConPool (管理 OLE DB Session) 兩個 COM 物件,實現連線重用、降低延遲、提升併發處理能力。本文詳細解析連接池運作原理、物件模型、安全性驗證機制、平衡/收縮策略,以及 IIS 託管環境下的執行緒模型配置陷阱。
| 物件 | ProgID | 管理目標 | 適用資料存取技術 |
|---|---|---|---|
| ADOConPool | MSXMLAnalysis.ADOConPool | ADO Connection 物件 | ADO (Classic ASP, VB6, .NET COM Interop) |
| OLEDBConPool | MSXMLAnalysis.OLEDBConPool | OLE DB Session 物件 | OLE DB (C++, ATL, 直接存取) |
兩者共享相同底層池管理機制,支援 Microsoft OLE DB Provider for OLAP Services 8.0 (MSOLAP.2),需 SQL Server 2000 SP1 以上版本。
客戶端呼叫歸還方法,池管理器驗證連線屬於該池後,放回可用連線集。極簡流程,無額外開銷。
現象:使用者 A 屬角色 R (可存取 Cube1, Cube2) → 取得連線 C → 歸還 → 管理員修改 R 僅存取 Cube1 → 使用者 A 再次請求 → 仍獲連線 C → 仍可存取 Cube2 (舊權限殘留)。
根因:池重用機制僅在建立新連線時向 Analysis Server 驗證;重用現有連線跳過驗證。
解決方案:
ShrinkPool 或重啟進程。#include
#import "\msxaserv.dll" \
rename("tag_inner_PROPVARIANT", "tagPROPVARIANT") \
rename("_LARGE_INTEGER", "") \
rename("_ULARGE_INTEGER", "")
using namespace MSXMLAnalysisSCLib;
需在專案屬性 → C/C++ → General → Additional Include Directories 加入 msxaserv.dll 所在目錄。
定期檢查可用連線集大小,若超過閾值,關閉最久未使用的連線,釋放伺服器資源。
應用程式閒置期 (如夜間) 主動呼叫 ShrinkPool 方法,將可用連線數降至最小 (或 0),配合資料庫伺服器端的閒置連線逾時設定。
兩機制均為被動、非阻塞設計,不影響正常請求取得連線。
ASP/ASP.NET 應用將池物件存放在 Application 或 Session 物件變數中 → IIS 5.0+ 預設檢查 COM 元件 Threading Model → XML for Analysis Provider 支援 Free-threaded 但未提供 FTM (Free-threaded Marshaler) → IIS 判定為「非靈活」 → 使用系統安全性內容 (預設 IUSR/應用程式池身分) 呼叫池方法 → 模擬機制失效,所有使用者共用同一連線,嚴重安全風險。
ASPTrackThreadingModel = TRUE (僅在該虛擬目錄/網站層級設定,避免全域效能衰退)。Microsoft.AnalysisServices.AdomdClient (ADOMD.NET) 內建連接池 (支援連線字串 Pooling=true; Max Pool Size=100),完全繞過 COM 執行緒模型限制。ASPTrackThreadingModel=TRUE;Active Connections、Pooled Connections、Connection Wait Time (效能計數器)。