這幾天在看Java的一些東西,除了覺的Java和.NET的相似度實在太高之外,就是Java太原始,急需被拯救。之後又回到.NET的思維來,想著怎麼在框架里實現讀寫分離控制請求切換。之前幾個月一直都有在思考,想及對框架現有的代碼改動可能較大,所以遲遲沒怎麼下手。最近終於在廁所蹲下的一瞬間,靈光一閃,感... ...
前言
好多年沒寫關於此框架的新功能的介紹了,這些年一直在默默地更新,從Nuget上的記錄就可以看出來:
這幾天在看Java的一些東西,除了覺的Java和.NET的相似度實在太高之外,就是Java太原始,急需被拯救。
之後又回到.NET的思維來,想著怎麼在框架里實現讀寫分離控制請求切換。
之前幾個月一直都有在思考,想及對框架現有的代碼改動可能較大,所以遲遲沒怎麼下手。
最近終於在廁所蹲下的一瞬間,靈光一閃,感覺思緒來了,然後一鼓作氣,就把它給作了。
資料庫讀寫分離的三步曲
1:實現主(讀)從(寫)同步的功能
A:MSSQL的複製訂閱;
B:MySql的Master-Slave配置ini。
C:Oracle自身組件或第三方軟體。
具體怎麼實現,請以讀寫分離為關鍵字自行Google。
2:讀寫分離控制請求的3種方式
A:通過代碼控制鏈接的切換(常用)。
B:通過中間第三方插件實現(需要放棄治療:數據一致性)。
C:通過資料庫驅動實現(沒怎麼見著)。
3:數據的一致性問題
由於主從資料庫的同步時間差,必然產生數據一致性這個問題,所以通常還是會回到業務代碼上控制。
代碼解決主(寫)從(讀)請求分配與數據一致性
1:讀寫請求的分配原則
在底層:DbCommand的三個方法中:
分配讀:ExecuteScalar和ExecuteReader
分配寫:ExecuteNonQuery
2:讀寫請求的追加原則:
A:事務時:全分配到主資料庫
B:非事務時:同一個鏈接,只要產生寫主資料庫,後續讀仍掛在主資料庫(初步解決數據一致性問題)。
3:處理數據一致性問題:
示例場景如:用戶寫完博客後(寫),跳轉到查看文章頁面(讀)。
很明顯,如果主從庫還沒來得及同步,你要提示用戶:緩存正在同步,請等待N秒後刷新看看?
A:這場景,不是同一個鏈接,卻是同一個人。
B:需要把同一個人產生寫主資料庫操作後,必須在N秒內的操作都仍掛在主資料庫。
所以,我用了三個方式來判斷是否同一個人:
A:SessionID。
B:Cookie
C:線程ID
至此,讀寫分離的相關功能就算完成了。
CYQ.Data讀寫分離的使用演示
下麵演示讀寫分寫在ASP.NET Aries 框架上的使用示例:
1:從SVN下載ASP.NET Aries 開源框架的源碼。
具體看:http://www.cnblogs.com/cyq1162/p/5487796.html
2:確保packages下的CYQ.Data 版本為V5.6以上,如果版本不夠新,上Nuget搜cyqdata更新。
3:在資料庫中建立好主從庫訂閱複製功能(MSSQL),演示就在同一臺電腦了,Copy的為從(讀)資料庫。
4:Web.config中添加一條資料庫鏈接
PS說明:
如果主資料庫name是XXXX,那麼從庫的配置為:XXXX_Slave1、XXXX_Slave2、XXXX_Slave3.....XXXX_SlaveN
搞定收功,使用就是這麼簡單,只要配資料庫鏈接,就一切就OK了。
界面運行後截圖
1:Chorme瀏覽器,登陸後編輯用戶信息(此時操作的主資料庫):
2:保存後跳轉到列表頁面:此時還是操作的主資料庫:
3:在FireFox瀏覽器里立即刷新查看:讀的是從資料庫,此時主從還沒同步好,所以還是舊數據。
隱藏技能:
通過配置XXXX_Bak,當主資料庫掛了時,會自動切換到備份資料庫。
於是架構就變成1主+1備+N從的方式。
總結
用了此框架,你會發現1行業務代碼都無需要改,只需config文件配上N個從數據的鏈接,資料庫讀寫分離這種傳說中的東西,馬上就屬於你了。
不要問我這幾年為啥這麼低調沒怎麼推廣此框架,只是看淡了,不爭,最好用的框架只屬於少數的有緣人。
補充一條好消息:框架從V5.5.6.1版本開始,MSSQL資料庫可以免費使用,不再需要授權。
對於免費開放MSSQL使用的消息,喜歡就贊一個!