預設累積 10 條 SQL 才發送一次,可自訂門檻與交易隔離等級。
using (DbBatch batch = DbSession.Default.BeginBatchConnection()) {
batch.Update(Products._.ProductName, "apple", Products._.ProductID == 1);
batch.Update(Products._.ProductName, "pear", Products._.ProductID == 2);
batch.Update(Products._.ProductName, "orange", Products._.ProductID == 3);
} // 區塊結束自動發送剩餘 SQL
產生 SQL(單次發送):
UPDATE [Products] SET [ProductName]=@p0 WHERE [ProductID]=@p1;
UPDATE [Products] SET [ProductName]=@p2 WHERE [ProductID]=@p3;
UPDATE [Products] SET [ProductName]=@p4 WHERE [ProductID]=@p5;
Parameters: @p0=apple, @p1=1, @p2=pear, @p3=2, @p4=orange, @p5=3
// 累積 20 條才發送,交易等級 ReadCommitted
DbBatch batch = DbSession.Default.BeginBatchConnection(20, IsolationLevel.ReadCommitted);
using (DbBatch batch = DbSession.Default.BeginBatchConnection()) {
batch.Update(...); // 第 1 條
batch.Update(...); // 第 2 條
batch.Execute(); // 強制發送前 2 條
batch.Update(...); // 第 3 條(新批次起始)
} // 區塊結束發送第 3 條
輸出:分兩批執行,各自獨立參數化。
DbBatch batch = DbSession.Default.BeginBatchConnection();
try {
batch.Update(...);
batch.Update(...);
batch.Update(...);
}
catch {
// 錯誤處理
}
finally {
batch.Close(); // 必須關閉,發送剩餘 SQL 並釋放連線
}
| 場景 | 無批次 | 有批次 (20) | 提升 |
|---|---|---|---|
| 匯入 10,000 筆訂單 | 10,000 次網路往返 | 500 次 | 20x |
| 夜間帳務結轉 100,000 筆 | 極慢、易逾時 | 秒級完成 | 數量級 |
| 記錄用戶行為日誌 | 每請求一個連線 | 合併寫入 | 連線池壓力大降 |
BeginBatchConnection 指定 IsolationLevel 或外層包 DbTrans。Execute(),避免單次封包過大導致網路層分片。DbBatch 是 Hxj.Data 高效能寫入的利器,善用批次大小調整與強制執行,可輕鬆應對百萬級資料匯入、日誌記錄、ETL 等場景。