首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

善用 MARS (Multiple Active Result Sets) 優化 ADO.NET 2.0 資料存取效能

     編輯:關於.NET

MARS (Multiple Active Result Sets) 是 ADO.NET 2.0 引入的關鍵特性,允許在單一 SqlConnection 上同時擁有多個作用中、唯讀、順向的結果集。SQL Server 2005 為首個支援 MARS 的商用資料庫。善用 MARS 可簡化程式碼、降低記憶體壓力、減少連線池爭用,對高併發 Web 應用尤為重要。

啟用 MARS:連線字串設定

string connectionString = "Data Source=DBSERVER;" +
    "Initial Catalog=AdventureWorlds;Integrated Security=SSPI;" +
    "MultipleActiveResultSets=True";

預設為 False,可明確設定 False 停用。

實戰情境:傳統多連線 vs MARS 單連線

假設需從查詢 A、B 取得資料,更新資料表 C,並寫入稽核記錄到資料表 D。

傳統作法(多連線、順序執行)

  • 開啟連線 A → 執行查詢 → 填充資料集 → 關閉連線 A
  • 開啟連線 B → 執行查詢 → 填充資料集 → 關閉連線 B
  • 開啟連線 C、D → 更新 C、寫入 D → 關閉 C、D

缺點:需在記憶體緩存查詢結果(如用 ArrayList),連線開關成本高,程式碼冗長。

MARS 作法(單連線、交錯執行)

  • 啟用 MARS 開啟單一連線
  • 建立多個 SqlCommand 共用此連線
  • 執行查詢 A 的 SqlDataReader 讀取時,同步呼叫更新 C 的命令
  • 執行查詢 B,同步寫入 D
  • 關閉連線

優勢:無需記憶體緩存中間結果、連線數降至 1、程式碼簡潔易維護。

程式碼對比:銷售訂單庫存扣減案例

未使用 MARS(雙連線 + 記憶體緩存)

// 連線 1:讀取訂單明細
SqlConnection readConn = new SqlConnection(connStr);
readConn.Open();
SqlCommand readCmd = new SqlCommand(sqlGetOrder, readConn);
using (SqlDataReader rdr = readCmd.ExecuteReader()) {
    while (rdr.Read()) { ids.Add(rdr["ProductID"]); qtys.Add(rdr["OrderQty"]); }
}
readConn.Close();

// 連線 2:更新庫存
SqlConnection writeConn = new SqlConnection(connStr);
writeConn.Open();
SqlCommand writeCmd = new SqlCommand(sqlUpdateInv, writeConn);
// 參數設定...
for (int i=0; i

使用 MARS(單連線、串流處理)

string connStr = "...;MultipleActiveResultSets=True";
SqlConnection marsConn = new SqlConnection(connStr);
marsConn.Open();
SqlCommand readCmd = new SqlCommand(sqlGetOrder, marsConn);
SqlCommand writeCmd = new SqlCommand(sqlUpdateInv, marsConn);
// 參數設定...
using (SqlDataReader rdr = readCmd.ExecuteReader()) {
    while (rdr.Read()) {
        writeCmd.Parameters["@amt"].Value = rdr["OrderQty"];
        writeCmd.Parameters["@pid"].Value = rdr["ProductID"];
        writeCmd.ExecuteNonQuery(); // 即時更新,無需緩存
    }
}
marsConn.Close();

注意事項與最佳實務

  • MARS 上的作業仍為序列執行,若需真正平行處理,仍需多連線
  • 啟用 MARS 的連線會佔用較多伺服器資源,僅在需要多重作用中結果集時啟用
  • 若僅需單一結果集,啟用 MARS 反而會降低效能
  • 建構多連線應用時,審慎評估哪些連線需 MARS,哪些不需,以最大化資源利用率

總結:MARS 是 ADO.NET 2.0 极具價值的進階功能,能顯著提升資料密集型應用的開發效率與執行效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved