在上一篇中我們配置好了主從庫,現在我們嘗試在程式中使用主從庫。
主從庫之間是一種發布訂閱的關係,發行者和訂閱者之間並非即時同步的,通常會有幾分鐘的延時,更有甚者會有幾個小時的延時。所以我們需要通過合理的使用來避開有延時這個問題。
我們希望主庫儘可能的少參與查詢,來提高寫的及時性;同時要讓從庫在不影響讀出資料的準確及時的前提下儘可能的分擔主庫的壓力。
主從兩個庫需要在設定檔中配置兩個連接字串,CONN_Master和CONN_Slave。我們需要設定一些規則決定當前的查詢應該從主庫查還是需要從從庫查。這個規則沒有定式,只能根據業務需要來確定。下面我舉幾個例子來說明:
1. 以豆瓣讀書書的詳細頁為假定情境,你可以點擊這裡看下頁面的結構(我不是豆瓣的技術,在這裡只是拿這個頁面舉例)
我們來分析呈現這個頁面需要的資料和這些資料的實效性要求
1) 書的詳細資料 時效性要求:要求及時
2) 豆瓣成員的常用標籤 實效性:不需要很及時
3) 喜歡讀這本書的人也喜歡讀的書 屬於分析資料,不需要很及時
4) 最新書評 要求及時
5) 讀這本書的幾個使用者 及時性不高
6) 喜歡這本書的人常去的小組 屬於分析資料不需要很及時
從上面的分析可以看出只有1),4)兩項資料需要從主庫讀,而2),3),5),6)為非及時資料從從庫讀取即可。當然我們可以對這些實效性不高的資料做緩衝處理。
2. 以論壇貼文清單頁面為假定情境,玩論壇的人都喜歡頂貼,把自己的文章頂到第一頁讓更多的人關注,而對於50頁之後的文章則反讀的人很少;我們可以根據這個商務邏輯特徵來決定在使用者訪問前50頁貼文清單資料時從主庫讀,而當使用者訪問超過50頁之後的資料時則從從庫進行查詢。
3. 以訂單為例,通常超過三個月的訂單就不會再有變化了,假定我們把訂單號設計為日期格式時,根據訂單號去查詢訂單時就可以根據訂單號來決定該訪問主庫還是從庫。
舉了幾個適用的情境,我們以第三個情境為例,寫一段簡單的示意代碼看下
//orderNo 的格式為 20100528120105000001 即yyyyMMddHHmmss + 序號public OrderInfo GetOrder(string orderNo) { string connString = ConnStringGetter.GetForOrder(orderNo); using (SqlConnection conn = new SqlConnection(connString)) { ... }}public class ConnStringGetter{ public static string GetForOrder(string orderNo) { int year = int.Parse(orderNo.Substring(0,4)); int money = int.Parse(orderNo.Substring(4,2)); int date = int.Parse(orderNo.Substring(6,2)); DateTime orderTime = new DateTime(year, money, date); TimeSpan ts = DateTime.Now - orderTime;//根據訂單的時間決定使用主庫還是從庫 if (ts.TotalDays > 30) return ConfigurationManager.ConnectionStrings["CONN_Slave"].ConnectionString; return ConfigurationManager.ConnectionStrings["CONN_Master"].ConnectionString; }}
正確的使用主從庫,可以很好的提升系統的效能。使用主庫還是從庫的選擇權決定在商務邏輯的手裡。
相關隨筆:Asp.Net 網站最佳化 資料庫最佳化措施 使用主從庫(上)