成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Furion分表分庫我也要happy coding

KnewOne / 1399人閱讀

摘要:分表分庫集成易用簡單高性能普適性,是一款擴展針對生態(tài)下的分表分庫的擴展解決方案支持的所有版本支持的所有數(shù)據(jù)庫支持自定義路由動態(tài)路由高性能分頁讀寫分離的一款組件,如果你喜歡這組件或者這個組件對你有幫助請點擊下發(fā)讓更多的可以看到使用助力生態(tài)

Furion分表分庫集成ShardingCore

ShardingCore

ShardingCore 易用、簡單、高性能、普適性,是一款擴展針對efcore生態(tài)下的分表分庫的擴展解決方案,支持efcore2+的所有版本,支持efcore2+的所有數(shù)據(jù)庫、支持自定義路由、動態(tài)路由、高性能分頁、讀寫分離的一款組件,如果你喜歡這組件或者這個組件對你有幫助請點擊下發(fā)star讓更多的.neter可以看到使用


Github Star 助力dotnet 生態(tài) Gitee Star


背景

隨著.net6的發(fā)布,陸陸續(xù)續(xù)的框架都已經(jīng)開始支持了,ShardingCore也不例外,為了推動.net生態(tài),也為了讓更多的的人了解.net下其實也有分表分庫的解決方案,所以打算寫一篇關(guān)于ShardingCore集成到其他框架的思路。

Fourin框架大家應(yīng)該也是比較清楚的,作者也是一個樂于開源有著開源精神的人,秉著大家都是熱愛開源的所以決定助Fourin一臂之力(蹭一下熱度)。隨著上次的AbpVNext的"完美"集成ShardingCore后,這次帶來的就是Furion下的ShardingCore集成。

efcore下完美的分表分庫解決方案,支持任意efcore的集成框架,完美支持或者需要稍作修改即可完美支持,并不需要讓你有任何使用的學(xué)習(xí)成本,幾乎做到不修改現(xiàn)有efcore代碼的前提下讓你的程序完美支持分表分庫。真正做到“零”代碼修改。

新建Furion項目

首先我們已目前Furion最新版本為例v3.0.5,新建一個空的aspnetcore web api的net6項目,當(dāng)然也支持efcore2+的所有aspnetcore版本。

然后我們添加ShardingCoreefcore.SqlServer

新建dbcontext

這邊看了Furion的使用方法和Abp一樣需要繼承一個他自己的DbContext叫做AppDbContext,但是沒有關(guān)西。因為ShardingCore是基于接口來實現(xiàn)的,所以不存在多繼承問題,只是我們需要自行實現(xiàn)Furion的ShardingDbContext的抽象版本源碼地址 AppShardingDbContext

簡單的說下就是如果你是需要繼承某個dbcontext的那么就需要自己實現(xiàn)三個接口IShardingDbContext, ISupportShardingTransaction, ISupportShardingReadWrite分別是分表分庫的核心接口,支持事務(wù),支持讀寫分離。

具體已經(jīng)幫你們抽象好了只需要復(fù)制代碼就可以了。

做好了準(zhǔn)備工作我們開始新建dbcontext

    [AppDbContext("SqlServerConnectionString", DbProvider.SqlServer)]    public class DefaultDbContext : AppShardingDbContext,IShardingTableDbContext    {        public DefaultDbContext(DbContextOptions options) : base(options)        {        }        public IRouteTail RouteTail { get; set; }    }

創(chuàng)建todoitem對象

    public class TodoItem:IPrivateEntity    {        public string Id { get; set; }        public string Name { get; set; }    }

  

這邊我們將TodoItemId做成取模分表

配置dbcontext

    [AppDbContext("SqlServerConnectionString", DbProvider.SqlServer)]    public class DefaultDbContext : AppShardingDbContext,IShardingTableDbContext    {        public DefaultDbContext(DbContextOptions options) : base(options)        {        }        public IRouteTail RouteTail { get; set; }        protected override void OnModelCreating(ModelBuilder modelBuilder)        {            base.OnModelCreating(modelBuilder);            modelBuilder.Entity(entity =>            {                entity.HasKey(o => o.Id);                entity.Property(o => o.Id).IsRequired().IsUnicode(false).HasMaxLength(50).HasComment("Id");                entity.Property(o => o.Name).IsRequired().HasMaxLength(50).HasComment("名稱");                entity.ToTable(nameof(TodoItem));            });        }    }

  

配置了todoitem的簡單配置,注意這邊不一定要這么配置,也可以用Attribute+DbSet,也可以用FluentApi

創(chuàng)建TodoItem的分表路由

    public class TodoItemVirtualTableRoute : AbstractSimpleShardingModKeyStringVirtualTableRoute    {        public TodoItemVirtualTableRoute() : base(2, 8)        {        }        public override void Configure(EntityMetadataTableBuilder builder)        {            builder.ShardingProperty(x => x.Id);        }    }

  這邊采用的是簡單取模通過構(gòu)造函數(shù)傳入,具體可以參考文檔就是分表后綴為2位數(shù),模8也就是00,01.....07,一共8張表,ShardingProperty(x => x.Id)表示TodoItem的分表字段為Id。

注意: 這邊只是為了簡單演示,你如果需要外部傳入可以自行通過實現(xiàn)AbstractShardingOperatorVirtualTableRoute來實現(xiàn),并且路由構(gòu)造函數(shù)支持單例的依賴注入

初始化Furion配置

AppStartup

    [AppStartup(600)]    public sealed class SqlServerEntityFrameworkCoreStartup : AppStartup    {        public static readonly ILoggerFactory efLogger = LoggerFactory.Create(builder =>        {            builder.AddFilter((category, level) => category == DbLoggerCategory.Database.Command.Name && level == LogLevel.Information).AddConsole();        });        public void ConfigureServices(IServiceCollection services)        {            var connStr = DbProvider.GetConnectionString(/*這里可寫可不寫*/);            // 配置數(shù)據(jù)庫上下文,支持N個數(shù)據(jù)庫            services.AddDatabaseAccessor(options =>            {                // 配置默認數(shù)據(jù)庫                options.AddDb(o =>                {                    o.UseSqlServer(connStr).UseSharding().UseLoggerFactory(efLogger);                });            });            services.AddShardingConfigure((s, builder) =>            {                builder.UseSqlServer(s).UseLoggerFactory(efLogger);            }).Begin(o =>            {                o.CreateShardingTableOnStart = true;                o.EnsureCreatedWithOutShardingTable = true;                o.AutoTrackEntity = true;            })                 .AddShardingTransaction((connection, builder) =>                     builder.UseSqlServer(connection).UseLoggerFactory(efLogger))                 .AddDefaultDataSource("ds0", connStr)                 .AddShardingTableRoute(o =>                 {                     o.AddShardingTableRoute();                 }).End();        }    }

  通過官網(wǎng)我們可以知道如何針對Furion進行efcore的配置,這邊目前sharding-core不支持efcore的單例dbcontext,所以不建議使用單例。

額外配置:.UseSharding()僅需要配置dbcontext使用sharding原先的所有dbcontext的注入都可以不去管他

sharding-core的配置:AddShardingConfiguresharding-core在efcore的基礎(chǔ)上額外進行配置就可以支持分表分庫的擴展更多配置可以參考文檔

Program

using ShardingCore.Bootstrapers;var builder = WebApplication.CreateBuilder(args).Inject();// Add services to the container.builder.Services.AddControllers().AddInject();var app = builder.Build();// Configure the HTTP request pipeline.app.UseAuthorization();app.UseInject();app.Services.GetRequiredService().Start();app.MapControllers();app.Run();

 注意:很多同學(xué)老是忘記啟動導(dǎo)致sharding-core沒法使用app.Services.GetRequiredService().Start(); 

編寫控制器

首先我們通過注入構(gòu)造函數(shù)IRepository todoItemRepository這是Furion提供的

其次我們編寫增刪改查接口

    [HttpGet]    public async Task Add()    {        await _todoItemRepository.InsertAsync(new TodoItem() { Id = Guid.NewGuid().ToString("n"), Name = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") });        await _todoItemRepository.SaveNowAsync();        return Ok();    }    [HttpGet]    public async Task List()    {        var list = await _todoItemRepository.AsQueryable().ToListAsync();        return Ok(list);    }    [HttpGet]    public async Task First([FromQuery]string id)    {        var todoItem = await _todoItemRepository.FirstOrDefaultAsync(o => o.Id == id);        return Ok(todoItem);    }    [HttpGet]    public async Task Update([FromQuery]string id)    {        var todoItem = await _todoItemRepository.FirstOrDefaultAsync(o => o.Id == id);        todoItem.Name = "123";        await _todoItemRepository.SaveNowAsync();        return Ok(todoItem);    }

啟動項目

因為默認為了測試ShardingCore配置了

 o.CreateShardingTableOnStart = true; o.EnsureCreatedWithOutShardingTable = true;

 所以啟動會幫我們建表并且建庫

新增

符合預(yù)期插入到了具體的hash%8的表

查詢所有

因為是獲取所有所以這邊會查詢所有的分表符合預(yù)期

獲取單條

獲取單條符合預(yù)期用的id取模所以用id去查詢會到指定的表里面

更新

符合預(yù)期代碼先查詢05表在更新05表并且使用的是追蹤更新

我們接著再來查詢一次看看是否真的修改了

到此為止我們的FurionShardingCore集成就完成了,當(dāng)然這只是ShardingCore的冰山一角,最最最簡單的分表,如果你喜歡或者你認為ShardingCore有用那么可以給個贊或者star嗎?開原作者希望自己開源的項目被更多人高人指點并且進步。也希望為.net下的分表分庫進行一份微薄之力。在efcore下我相信ShardingCore是在官方不支持efcore下最最最完美的解決方案。全程的使用代碼體驗是0感知,并且支持所有使用efcore的框架,只要你配置好了完全不需要考慮,當(dāng)然也有同學(xué)要杠,如果某些情況下我就是要指定某幾張表呢,ShardingCore也是支持的所以在自動情況下是“零”入侵業(yè)務(wù)代碼的最優(yōu)分表分庫方案,更多使用方式請查詢

github ShardingCore文檔

gitee ShardingCore文檔

最后項目源碼

FurionShardingDemo

dotnet 天下第一 (大吼)

分表分庫組件求贊求star


博客

QQ群:771630778

個人QQ:326308290(歡迎技術(shù)支持提供您寶貴的意見)

個人郵箱:[email protected]

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/124816.html

相關(guān)文章

  • TiDB at 豐巢:嘗鮮分布式數(shù)據(jù)庫

    摘要:為此,一款高性能的分布式數(shù)據(jù)庫,日漸成為剛需?;谌缟系脑?,我們選擇了,作為豐巢的核心系統(tǒng)的分布式數(shù)據(jù)庫,來取代和。 作者:豐巢技術(shù)團隊 隨著豐巢業(yè)務(wù)系統(tǒng)快速增長,其核心系統(tǒng)的數(shù)據(jù)量,早就跨越了億級別,而且每年增量仍然在飛速發(fā)展。整個核心系統(tǒng)隨著數(shù)據(jù)量的壓力增長,不但系統(tǒng)架構(gòu)復(fù)雜度急劇增長,數(shù)據(jù)架構(gòu)更加復(fù)雜,傳統(tǒng)的單節(jié)點數(shù)據(jù)庫,已經(jīng)日漸不能滿足豐巢的需求,當(dāng)單表數(shù)量上億的時候,Ora...

    sixgo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<