91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.NET Core如何實現分表分庫、讀寫分離的通用Repository功能

發布時間:2021-06-18 09:47:51 來源:億速云 閱讀:162 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關.NET Core如何實現分表分庫、讀寫分離的通用Repository功能的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

首先聲明這篇文章不是標題黨,我說的這個類庫是 FreeSql.Repository,它作為擴展庫現實了通用倉儲層功能,接口規范參考 abp vnext 定義,實現了基礎的倉儲層(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) //自動遷移實體的結構到數據庫
 .Build();

過濾與驗證

假設我們有User(用戶)、Topic(主題)兩個實體,在某領域類中定義了兩個倉儲:

var userRepository = fsql.GetGuidRepository<User>();
var topicRepository = fsql.GetGuidRepository<Topic>();

開發過程中,我總會擔心 topicRepository 的數據安全問題,即有可能查詢或操作到其他用戶的主題。因此在v0.0.7版本進行了改進,增加了 filter lambad 表達式參數。

var userRepository = fsql.GetGuidRepository<User>(a => a.Id == 1);
var topicRepository = fsql.GetGuidRepository<Topic>(a => a.UserId == 1);
  • 在查詢/修改/刪除時附加此條件,從而達到不會修改其他用戶的數據;

  • 在添加時,使用表達式驗證數據的合法性,若不合法則拋出異常;

有朋友說這個功能像 abp 的租戶,但這是更小單位的過濾+驗證,確保數據安全。
有朋友說這個功能省事,但我覺得是省心。

分表與分庫

GuidRepository 作為分存式倉儲將實現了分表與分庫(不支持跨服務器分庫)的封裝類。

var logRepository = fsql.GetGuidRepository<Log>(null, oldname => $"{oldname}_{DateTime.Now.ToString("YYYYMM")}");

上面我們得到一個日志倉儲實例按年月分表,使用它 CURD 最終會操作 Log_201903 表。

注意:雖然 FreeSql 支持 CodeFirst 遷移,但不提供遷移分表,開發環境中仍然可以遷移 Log 表。

讀寫分離

FreeSql 支持數據庫讀寫分離,本功能是客戶端的讀寫分離行為,數據庫服務器該怎么配置仍然那樣配置,不受本功能影響,為了方便描術后面講到的【讀寫分離】都是指客戶端的功能支持。

各種數據庫的讀寫方案不一,數據庫端開啟讀寫分離功能后,讀寫分離的實現大致分為以下幾種:

1、nginx代理,配置繁瑣且容易出錯;

2、中件間,如MySql可以使用MyCat,但是其他數據庫怎么辦?

3、在client端支持;

FreeSql 實現了第3種方案,支持一個【主庫】多個【從庫】,【從庫】的查詢策略為隨機方式。

若某【從庫】發生故障,將切換到其他可用【從庫】,若已全部不可用則使用【主庫】查詢。

出現故障【從庫】被隔離起來間隔性的檢查可用狀態,以待恢復。以 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") //使用從數據庫,支持多個
 .Build();

select.Where(a => a.Id == 1).ToOne(); //讀【從庫】(默認)
select.Master().WhereId(a => a.Id == 1).ToOne(); //強制讀【主庫】
其他特性
  • [x] 支持 CodeFirst 遷移;

  • [x] 支持 DbFirst 從數據庫導入實體類,支持三種模板生成器;

  • [x] 采用 ExpressionTree 高性能讀取數據;

  • [x] 支持深入的類型映射,比如pgsql的數組類型;

  • [x] 支持豐富的表達式函數;

  • [x] 支持導航屬性查詢,和延時加載;

  • [x] 支持同步/異步數據庫操作方法,豐富多彩的鏈式查詢方法;

  • [x] 支持讀寫分離、分表分庫;

  • [x] 支持多種數據庫,MySql/SqlServer/PostgreSQL/Oracle/Sqlite;

感謝各位的閱讀!關于“.NET Core如何實現分表分庫、讀寫分離的通用Repository功能”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

禄劝| 裕民县| 安福县| 思南县| 石嘴山市| 剑阁县| 乐至县| 宜章县| 安化县| 天祝| 德令哈市| 亚东县| 灵寿县| 上虞市| 三台县| 正宁县| 白山市| 浦城县| 湄潭县| 万源市| 渝中区| 景洪市| 平果县| 贵阳市| 孟州市| 修水县| 天台县| 辰溪县| 乐亭县| 茌平县| 大兴区| 泸州市| 仙居县| 湟中县| 长岭县| 临泽县| 新干县| 丰原市| 上高县| 竹溪县| 西和县|