.NET 分表分库动态化处理

本文介绍了如何在.NET环境中使用EF-Core实现高性能、轻量级的分表分库读写分离方案。通过自定义路由,实现了按需分片和动态建表,确保数据在不同时间段均匀分布。详细讲解了创建项目、配置分片路由、动态创建表及启动配置的步骤,并提供了相关示例项目的链接。
摘要由CSDN通过智能技术生成

介绍

本期主角:ShardingCore 一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案,具有零依赖、零学习成本、零业务代码入侵

我不是efcore怎么办

这边肯定有小伙伴要问有没有不是efcore的,我这边很确信的和你讲有并且适应所有的ADO.NET包括sqlhelper
ShardingConnector 一款基于ado.net下的高性能分表分库解决方案目前已有demo案例,这个框架你可以认为是.Net版本的ShardingSphere但是目前仅实现了ShardingSphere-JDBC,后续我将会实现ShardingSphere-Proxy希望各位.Neter多多关注

背景

最近有个小伙伴来问我,分表下他有一批数据,这个数据是白天可能会相对比较频繁数据录入,但是到了晚上可能基本上就没有对应的数据了,因为看到了我的框架,本来想以按小时来实现分表但是这么以来可能会导致一天有24张表,表多的情况下还导致了数据分布不均匀,这是一个很严重的问题因为可能以24小时制会让8-17这几张白天的表数据很多,但是晚上和凌晨的表基本没有数据,没有数据其实意味着这些表其实不需要去查询,基于这个情况想来问我应该如何实现这个自定义的路由。

听了他的需求,其实我这边又进行了一次确认,针对这个场景更多的其实是这个小伙伴需要的是按需分片,实时建表,来保证需要的数据进行合理的插入,那么我们应该如何在ShardingCore下实现这么一个需求呢,废话不多说直接开始吧~~~

创建项目

本次需求我们以mysql作为测试数据库,然后使用efcore6作为数据库驱动orm来实现怎么处理才能达到这个效果的分表分库(本次只涉及分表)。

新建一个项目

添加依赖

//请安装最新版本第一个版本号6代表efcore的版本号
Install-Package ShardingCore -Version 6.4.3.4

Install-Package Microsoft.EntityFrameworkCore.SqlServer -Version 6.0.1

新建一个对象表,配置对应的数据库映射关系并且关联到dbcontext

//创建数据库对象
    public class OrderByHour
    {
        public string Id { get; set; }
        public DateTime CreateTime { get; set; }
        public string Name { get; set; }
    }
//映射对象结构到数据库
    public class OrderByHourMap:IEntityTypeConfiguration<OrderByHour>
    {
        public void Configure(EntityTypeBuilder<OrderByHour> builder)
        {
            builder.HasKey(o => o.Id);
            builder.Property(o => o.Id).IsRequired().HasMaxLength(50);
            builder.Property(o => o.Name).IsRequired().HasMaxLength(128);
            builder.ToTable(nameof(OrderByHour));
        }
    }
//创建dbcontext为efcore所用上下文
    public class DefaultDbContext:AbstractShardingDbContext,IShardingTableDbContext
    {
        public DefaultDbContext(DbContextOptions<DefaultDbContext> options) : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.ApplyConfiguration(new OrderByHourMap());
        }

        public IRouteTail RouteTail { get; set; }
    }

到这边其实只需要启动时候依赖注入

services.AddDbContext<DefaultDbContext>(o=>o.UseMySql(xxxx));

那么efcore就可以运行了,这么一看其实并没有很复杂而且IEntityTypeConfiguration也不是必须的,efcore允许使用attribute来实现
当然DefaultDbContext:AbstractShardingDbContext,IShardingTableDbContext这一部分在原生efcore中应该是DefaultDbContext:DbContext

创建分片路由

首先我们来看一下ShardingCore针对分片路由的自定义情况的分析,通过文档我们可以了解到,如果想要使用自定义路由那么你只需要自己新建一个路由并且继承实现AbstractShardingOperatorVirtualTableRoute,当然这是分表的,分库是AbstractShardingOperatorVirtualDataSourceRoute.

接下来我们新建一个路由并且实现分表操作。

public class orderByHourRoute : AbstractShardingOperatorVirtualTableRoute<OrderByHour, DateTime>
    {
        public override string ShardingKeyToTail(object shardi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值