溫馨提示×

溫馨提示×

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

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

.NET Core中怎么實現(xiàn)分表分庫

發(fā)布時間:2021-08-06 16:08:10 來源:億速云 閱讀:287 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關.NET Core中怎么實現(xiàn)分表分庫,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

  FreeSql.Repository安裝

  dotnet add package FreeSql.Repository

  可用于:.net framework 4.6+、.net core 2.1+

  FreeSql.Repository的定義

  var fsql = new FreeSql.FreeSqlBuilder()

  .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Pooling=true;Max Pool Size=10")

  .UseLogger(loggerFactory.CreateLogger())

  .UseAutoSyncStructure(true) //自動遷移實體的結(jié)構到數(shù)據(jù)庫

  .Build();

  過濾與驗證

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

  var userRepository = fsql.GetGuidRepository();

  var topicRepository = fsql.GetGuidRepository();

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

  var userRepository = fsql.GetGuidRepository(a => a.Id == 1);

  var topicRepository = fsql.GetGuidRepository(a => a.UserId == 1);

  在查詢/修改/刪除時附加此條件,從而達到不會修改其他用戶的數(shù)據(jù);

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

  有朋友說這個功能像 abp 的租戶,但這是更小單位的過濾+驗證,確保數(shù)據(jù)安全。

  有朋友說這個功能省事,但我覺得是省心。

  分表與分庫

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

  var logRepository = fsql.GetGuidRepository(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(); //強制讀【主庫】

以上就是.NET Core中怎么實現(xiàn)分表分庫,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

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

AI