百科.dev
全部条目在线工具AI 编程趋势榜开源项目技术资讯提交条目
登录
< 返回工具列表
E

EFCore.Sharding

> 编程语言
开源

EFCore 的数据库分片

708 stars0 点赞0 次浏览
访问官网GitHub

工具介绍

EFCore 的数据库分片

  • 简介
  • 引言
  • 开始
    • 准备
    • 配置
    • 使用
    • 按时间自动分表
    • 性能测试
    • 其它简单操作(非Sharing)
  • 高级配置
    • 多主键等配置
    • 读写分离
  • 注意事项
  • 总结

简介

本框架旨在为EF Core提供Sharding(即读写分离分库分表)支持,不仅提供了一套强大的普通数据操作接口,并且降低了分表难度,支持按时间自动分表扩容,提供的操作接口简洁统一.

源码地址:EFCore.SHarding

引言

读写分离分库分表一直是数据库领域中的重难点,当数据规模达到单库极限的时候,就不得不考虑分表方案。EF Core作为.NET Core中最为主流的ORM,用起来十分方便快捷,但是官方并没有相应的Sharding支持,鄙人不才,经过一番摸索之后终于完成这个框架.

开始

准备

首先根据需要安装对应的Nuget包 最新版基于EFCore5,若需要使用EFCore3请使用EFCore3.Sharding

包名 说明
EFCore.Sharding 必装包
EFCore.Sharding.MySql MySql支持
EFCore.Sharding.PostgreSql PostgreSql支持
EFCore.Sharding.SQLite SQLite支持
EFCore.Sharding.SqlServer SqlServer支持
EFCore.Sharding.Oracle Oracle支持
EFCore3.Sharding 必装包
EFCore3.Sharding.MySql MySql支持
EFCore3.Sharding.PostgreSql PostgreSql支持
EFCore3.Sharding.SQLite SQLite支持
EFCore3.Sharding.SqlServer SqlServer支持
EFCore3.Sharding.Oracle Oracle支持

配置

csharp

ServiceCollection services = new ServiceCollection();
//配置初始化
services.AddEFCoreSharding(config =>
{
    //添加数据源
    config.AddDataSource(Config.CONSTRING1, ReadWriteType.Read | ReadWriteType.Write, DatabaseType.SqlServer);

    //对3取模分表
    config.SetHashModSharding(nameof(Base_UnitTest.Id), 3);
});

上述代码中完成了Sharding配置

  • AddEFCoreSharding注入EFCoreSharding
  • AddDataSource添加分表数据源
  • SetHashModSharding是采用哈希取模的分表规则,分表字段为Id,取模值为3,会自动生成表Base_UnitTest_0,Base_UnitTest_1,Base_UnitTest_2

使用

配置完成,下面开始使用,使用方式非常简单,与平常使用基本一致
首先通过注入获取到IShardingDbAccessor

csharp
var db=ServiceProvider.GetService();

然后即可进行数据操作:

…

上述操作中表面上是操作Base_UnitTest表,实际上却在按照一定规则使用Base_UnitTest_0~2三张表,使分片对业务操作透明,极大提高开发效率
具体使用方式请参考单元测试源码:连接

按时间自动分表

上面的哈希取模的方式虽然简单,但是却十分不实用,因为当3张分表到达瓶颈时,将会面临扩容的问题,这种方式扩容需要进行大量的数据迁移,这无疑是十分麻烦的。因此需要一种方式能够系统自动建表扩容,并且无需人工干预,这就是按时间自动分表.

…

上面Demo都在源码中

上面的代码实现了将Base_UnitTest表按照时间自动分表,每分钟创建一张表,实际使用中根据业务需求设置ExpandByDateMode参数,常用按天、按月分表

自动分表效果

全程无需人工干预,系统会自动定时创建分表,十分简单好用

性能测试

…

分表Base_UnitTest_0-2各有100万数据,然后将这三张表的数据导入Base_UnitTest中(即Base_UnitTest表的数据与Base_UnitTest_0-2三张表总合数据一致)

分表与不分表测试结果如下

这里仅仅分了3张表,其效果立杆见影,若分表几十张,那效果想想就很棒

其它简单操作(非Sharing)

框架不仅支持Sharing,而且封装了常用数据库操作,使用比较简单
详细使用方式参考 链接

高级配置

多主键等配置

多主键、索引等高级配置请使用IEntityTypeConfiguration 参考fluentApi

读写分离

数据库读写分离在大型项目中十分常见,通常在数据库层完成自动读写分离

  • MySQL可以使用ProxySQL完成全自动读写分离集群
  • PostgreSQL可以使用Pgool完成全自动读写分离集群
  • SQLServer可以使用AlwaysOn,但是需要在连接字符串中加上 ApplicationIntent=ReadOnly,因此只是半自动的
    本框架支持将半自动读写分离升级成全自动,即在代码层无需感知读写分离切换,代码层只需跟普通一样使用IDbAccessor即可
    代码如下(链接)
…

注意事项

  • 查询尽量使用分表字段进行筛选,避免全表扫描

总结

这个简单实用强大的框架希望能够帮助到大家,力求为.NET生态贡献一份力,大家一起壮大.NET生态

欢迎使用本框架,若觉得不错,请比心

Github欢迎星星:

博客园欢迎点赞:

QQ群3:940069478
个人QQ:862520575(欢迎技术支持及商务合作)

本人将会对这个快速开发框架不断完善与维护,希望能够帮助到各位 若遇到任何问题或需要技术支持,请联系我 ------学习永无止境,技术永无上限,代码就是艺术------

Issues· 0 开放

查看全部 Issues在 GitHub 打开

暂无开放 Issues,或尚未同步最近议题。

> 标签

C#

暂无评论,来聊聊你的看法吧

> 工具信息

发布日期2026年8月1日
最后更新2026年9月17日
分类编程语言
定价开源

> 相关工具

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言