.NET Core實(shí)現(xiàn)分表分庫(kù)、讀寫(xiě)分離的通用 Repository功能
首先聲明這篇文章不是標(biāo)題黨,我說(shuō)的這個(gè)類(lèi)庫(kù)是 FreeSql.Repository,它作為擴(kuò)展庫(kù)現(xiàn)實(shí)了通用倉(cāng)儲(chǔ)層功能,接口規(guī)范參考 abp vnext 定義,實(shí)現(xiàn)了基礎(chǔ)的倉(cāng)儲(chǔ)層(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) //自動(dòng)遷移實(shí)體的結(jié)構(gòu)到數(shù)據(jù)庫(kù) .Build();
過(guò)濾與驗(yàn)證
假設(shè)我們有User(用戶)、Topic(主題)兩個(gè)實(shí)體,在某領(lǐng)域類(lèi)中定義了兩個(gè)倉(cāng)儲(chǔ):
var userRepository = fsql.GetGuidRepository<User>(); var topicRepository = fsql.GetGuidRepository<Topic>();
開(kāi)發(fā)過(guò)程中,我總會(huì)擔(dān)心 topicRepository 的數(shù)據(jù)安全問(wèn)題,即有可能查詢或操作到其他用戶的主題。因此在v0.0.7版本進(jìn)行了改進(jìn),增加了 filter lambad 表達(dá)式參數(shù)。
var userRepository = fsql.GetGuidRepository<User>(a => a.Id == 1); var topicRepository = fsql.GetGuidRepository<Topic>(a => a.UserId == 1);
- 在查詢/修改/刪除時(shí)附加此條件,從而達(dá)到不會(huì)修改其他用戶的數(shù)據(jù);
- 在添加時(shí),使用表達(dá)式驗(yàn)證數(shù)據(jù)的合法性,若不合法則拋出異常;
有朋友說(shuō)這個(gè)功能像 abp 的租戶,但這是更小單位的過(guò)濾+驗(yàn)證,確保數(shù)據(jù)安全。
有朋友說(shuō)這個(gè)功能省事,但我覺(jué)得是省心。
分表與分庫(kù)
GuidRepository 作為分存式倉(cāng)儲(chǔ)將實(shí)現(xiàn)了分表與分庫(kù)(不支持跨服務(wù)器分庫(kù))的封裝類(lèi)。
var logRepository = fsql.GetGuidRepository<Log>(null, oldname => $"{oldname}_{DateTime.Now.ToString("YYYYMM")}");
上面我們得到一個(gè)日志倉(cāng)儲(chǔ)實(shí)例按年月分表,使用它 CURD 最終會(huì)操作 Log_201903 表。
注意:雖然 FreeSql 支持 CodeFirst 遷移,但不提供遷移分表,開(kāi)發(fā)環(huán)境中仍然可以遷移 Log 表。
讀寫(xiě)分離
FreeSql 支持?jǐn)?shù)據(jù)庫(kù)讀寫(xiě)分離,本功能是客戶端的讀寫(xiě)分離行為,數(shù)據(jù)庫(kù)服務(wù)器該怎么配置仍然那樣配置,不受本功能影響,為了方便描術(shù)后面講到的【讀寫(xiě)分離】都是指客戶端的功能支持。
各種數(shù)據(jù)庫(kù)的讀寫(xiě)方案不一,數(shù)據(jù)庫(kù)端開(kāi)啟讀寫(xiě)分離功能后,讀寫(xiě)分離的實(shí)現(xiàn)大致分為以下幾種:
1、nginx代理,配置繁瑣且容易出錯(cuò);
2、中件間,如MySql可以使用MyCat,但是其他數(shù)據(jù)庫(kù)怎么辦?
3、在client端支持;
FreeSql 實(shí)現(xiàn)了第3種方案,支持一個(gè)【主庫(kù)】多個(gè)【從庫(kù)】,【從庫(kù)】的查詢策略為隨機(jī)方式。
若某【從庫(kù)】發(fā)生故障,將切換到其他可用【從庫(kù)】,若已全部不可用則使用【主庫(kù)】查詢。
出現(xiàn)故障【從庫(kù)】被隔離起來(lái)間隔性的檢查可用狀態(tài),以待恢復(fù)。以 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ù)庫(kù),支持多個(gè) .Build(); select.Where(a => a.Id == 1).ToOne(); //讀【從庫(kù)】(默認(rèn)) select.Master().WhereId(a => a.Id == 1).ToOne(); //強(qiáng)制讀【主庫(kù)】
其他特性
- [x] 支持 CodeFirst 遷移;
- [x] 支持 DbFirst 從數(shù)據(jù)庫(kù)導(dǎo)入實(shí)體類(lèi),支持三種模板生成器;
- [x] 采用 ExpressionTree 高性能讀取數(shù)據(jù);
- [x] 支持深入的類(lèi)型映射,比如pgsql的數(shù)組類(lèi)型;
- [x] 支持豐富的表達(dá)式函數(shù);
- [x] 支持導(dǎo)航屬性查詢,和延時(shí)加載;
- [x] 支持同步/異步數(shù)據(jù)庫(kù)操作方法,豐富多彩的鏈?zhǔn)讲樵兎椒ǎ?/li>
- [x] 支持讀寫(xiě)分離、分表分庫(kù);
- [x] 支持多種數(shù)據(jù)庫(kù),MySql/SqlServer/PostgreSQL/Oracle/Sqlite;
結(jié)束語(yǔ)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
ASP.NET動(dòng)態(tài)增加HTML元素的方法實(shí)例小結(jié)
這篇文章主要介紹了ASP.NET動(dòng)態(tài)增加HTML元素的方法,結(jié)合實(shí)例形式總結(jié)分析了asp.net針對(duì)樣式、Meta、js等元素動(dòng)態(tài)增加相關(guān)操作技巧,需要的朋友可以參考下2017-01-01.NET 6開(kāi)發(fā)TodoList應(yīng)用之實(shí)現(xiàn)數(shù)據(jù)塑形
在查詢的場(chǎng)景中,還有一類(lèi)需求不是很常見(jiàn),就是在前端請(qǐng)求中指定返回的字段。所以這篇文章主要介紹了.NET 6如何實(shí)現(xiàn)數(shù)據(jù)塑形,需要的可以參考一下2022-01-01.NET?Core跨平臺(tái)資源監(jiān)控工具CZGL.SystemInfo用法
這篇文章介紹了.NET?Core跨平臺(tái)資源監(jiān)控工具CZGL.SystemInfo的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02asp.net源程序編譯為dll文件并調(diào)用的實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了asp.net源程序編譯為dll文件并調(diào)用的實(shí)現(xiàn)過(guò)程,非常有實(shí)用價(jià)值,需要的朋友可以參考下2014-07-07asp.net導(dǎo)出Excel顯示中文亂碼的解決方法
asp.net導(dǎo)出Excel顯示中文亂碼的解決方法,需要的朋友可以參考一下2013-03-03ASP.Net防止刷新自動(dòng)觸發(fā)事件的解決方案
ASP.Net防止刷新自動(dòng)觸發(fā)事件的解決方案...2006-09-09基于ASP.NET實(shí)現(xiàn)日期轉(zhuǎn)為大寫(xiě)的漢字
在寫(xiě)代碼時(shí)遇到一個(gè)需要將日期轉(zhuǎn)換為中文大寫(xiě)日期的問(wèn)題,網(wǎng)上找了找,示例不是很多,只有javascript代碼的,下面整理下在ASP.NET中怎么實(shí)現(xiàn)。2016-08-08asp.net中頁(yè)面顯示當(dāng)前系統(tǒng)時(shí)間附圖
asp.net如何實(shí)現(xiàn)在頁(yè)面顯示當(dāng)前系統(tǒng)時(shí)間,本文有個(gè)不錯(cuò)的方法,大家可以嘗試操作下,在文章末尾有截圖2013-12-12