介绍
本期主角:ShardingCore
一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案,具有零依赖、零学习成本、零业务代码入侵
我不是efcore怎么办
这边肯定有小伙伴要问有没有不是efcore的,我这边很确信的和你讲有并且适应所有的ADO.NET包括sqlhelperShardingConnector
一款基于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