.NET Core實現(xiàn)分表分庫、讀寫分離的通用 Repository功能
首先聲明這篇文章不是標題黨,我說的這個類庫是 FreeSql.Repository,它作為擴展庫現(xiàn)實了通用倉儲層功能,接口規(guī)范參考 abp vnext 定義,實現(xiàn)了基礎的倉儲層(CURD)。
安裝
dotnet add package FreeSql.Repository
可用于:.net framework 4.6+、.net core 2.1+
定義
var fsql = new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Pooling=true;Max Pool Size=10") .UseLogger(loggerFactory.CreateLogger<IFreeSql>()) .UseAutoSyncStructure(true) //自動遷移實體的結構到數(shù)據(jù)庫 .Build();
過濾與驗證
假設我們有User(用戶)、Topic(主題)兩個實體,在某領域類中定義了兩個倉儲:
var userRepository = fsql.GetGuidRepository<User>(); var topicRepository = fsql.GetGuidRepository<Topic>();
開發(fā)過程中,我總會擔心 topicRepository 的數(shù)據(jù)安全問題,即有可能查詢或操作到其他用戶的主題。因此在v0.0.7版本進行了改進,增加了 filter lambad 表達式參數(shù)。
var userRepository = fsql.GetGuidRepository<User>(a => a.Id == 1); var topicRepository = fsql.GetGuidRepository<Topic>(a => a.UserId == 1);
- 在查詢/修改/刪除時附加此條件,從而達到不會修改其他用戶的數(shù)據(jù);
- 在添加時,使用表達式驗證數(shù)據(jù)的合法性,若不合法則拋出異常;
有朋友說這個功能像 abp 的租戶,但這是更小單位的過濾+驗證,確保數(shù)據(jù)安全。
有朋友說這個功能省事,但我覺得是省心。
分表與分庫
GuidRepository 作為分存式倉儲將實現(xiàn)了分表與分庫(不支持跨服務器分庫)的封裝類。
var logRepository = fsql.GetGuidRepository<Log>(null, oldname => $"{oldname}_{DateTime.Now.ToString("YYYYMM")}");
上面我們得到一個日志倉儲實例按年月分表,使用它 CURD 最終會操作 Log_201903 表。
注意:雖然 FreeSql 支持 CodeFirst 遷移,但不提供遷移分表,開發(fā)環(huán)境中仍然可以遷移 Log 表。
讀寫分離
FreeSql 支持數(shù)據(jù)庫讀寫分離,本功能是客戶端的讀寫分離行為,數(shù)據(jù)庫服務器該怎么配置仍然那樣配置,不受本功能影響,為了方便描術后面講到的【讀寫分離】都是指客戶端的功能支持。
各種數(shù)據(jù)庫的讀寫方案不一,數(shù)據(jù)庫端開啟讀寫分離功能后,讀寫分離的實現(xiàn)大致分為以下幾種:
1、nginx代理,配置繁瑣且容易出錯;
2、中件間,如MySql可以使用MyCat,但是其他數(shù)據(jù)庫怎么辦?
3、在client端支持;
FreeSql 實現(xiàn)了第3種方案,支持一個【主庫】多個【從庫】,【從庫】的查詢策略為隨機方式。
若某【從庫】發(fā)生故障,將切換到其他可用【從庫】,若已全部不可用則使用【主庫】查詢。
出現(xiàn)故障【從庫】被隔離起來間隔性的檢查可用狀態(tài),以待恢復。以 mysql 為例:
var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10"; IFreeSql fsql = new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.MySql, connstr) .UseSlave("connectionString1", "connectionString2") //使用從數(shù)據(jù)庫,支持多個 .Build(); select.Where(a => a.Id == 1).ToOne(); //讀【從庫】(默認) select.Master().WhereId(a => a.Id == 1).ToOne(); //強制讀【主庫】
其他特性
- [x] 支持 CodeFirst 遷移;
- [x] 支持 DbFirst 從數(shù)據(jù)庫導入實體類,支持三種模板生成器;
- [x] 采用 ExpressionTree 高性能讀取數(shù)據(jù);
- [x] 支持深入的類型映射,比如pgsql的數(shù)組類型;
- [x] 支持豐富的表達式函數(shù);
- [x] 支持導航屬性查詢,和延時加載;
- [x] 支持同步/異步數(shù)據(jù)庫操作方法,豐富多彩的鏈式查詢方法;
- [x] 支持讀寫分離、分表分庫;
- [x] 支持多種數(shù)據(jù)庫,MySql/SqlServer/PostgreSQL/Oracle/Sqlite;
結束語
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關文章
.NET 6開發(fā)TodoList應用之實現(xiàn)數(shù)據(jù)塑形
在查詢的場景中,還有一類需求不是很常見,就是在前端請求中指定返回的字段。所以這篇文章主要介紹了.NET 6如何實現(xiàn)數(shù)據(jù)塑形,需要的可以參考一下2022-01-01.NET?Core跨平臺資源監(jiān)控工具CZGL.SystemInfo用法
這篇文章介紹了.NET?Core跨平臺資源監(jiān)控工具CZGL.SystemInfo的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02asp.net源程序編譯為dll文件并調(diào)用的實現(xiàn)過程
這篇文章主要介紹了asp.net源程序編譯為dll文件并調(diào)用的實現(xiàn)過程,非常有實用價值,需要的朋友可以參考下2014-07-07