Skip to content

Instantly share code, notes, and snippets.

@LinZap
Last active October 10, 2024 01:53
Show Gist options
  • Save LinZap/a0a491ed24aa8e5c862376136d457c07 to your computer and use it in GitHub Desktop.
Save LinZap/a0a491ed24aa8e5c862376136d457c07 to your computer and use it in GitHub Desktop.
使用 SQL Server 的 Always on 架構讓 SQL 指令讀寫分離

使用 SQL Server 的 Always on 架構讓 SQL 指令讀寫分離

版本:ZapLib v2.4.9

讀寫分離能提升資料庫系統的性能和可擴展性,將讀取和寫入操作分配到不同的伺服器節點來減輕主要伺服器的負擔。特別是在大量讀取需求的應用場景中。這不僅能提高系統的響應速度,還能增強整體的可用性。在實作讀寫分離前,假設你已經準備好高可用的資料庫集群(如 SQL Server AlwaysOn Availability Groups)、設定資料庫副本的同步機制、配置讀取副本的讀寫路由。
ZapLib 提供簡便的連線字串設置方法,讓程式碼能同時支援「有讀寫分離」與「無讀寫分離」的架構,減少複雜的判斷與重構。

全域設置

Config 檔案中可添加 EnableDBAlwaysOn 全域指定是否要開啟只有 Always on 才有的讀寫分離設置,預設為關閉,如此一來程式碼就不需要特別為了沒有讀寫分離的架構重新撰寫程式碼。 EnableDBAlwaysOn 指定為 False 或不指定時, 連線字串將強制改為 ApplicationIntent=ReadWrite

 <appSettings>
    <add key="EnableDBAlwaysOn" value="true"/>
  </appSettings>

讀寫分離的 SQL 指令

當 Config 中設置 EnableDBAlwaysOntrue 時,以下設定 db.SQLReadOnly = true 才會生效,將自動把資料庫連線字串將強制改為 ApplicationIntent=ReadOnly

SQL db = new SQL();
// 指派 sql 導向為 read only 的分流
db.SQLReadOnly = true;
dynamic[] data = db.QuickDynamicQuery("select * from entity");

回 ZapLib v2.4.9 changelog

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment