EFCore 的数据库分片
本框架旨在为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支持 |
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配置
配置完成,下面开始使用,使用方式非常简单,与平常使用基本一致
首先通过注入获取到IShardingDbAccessor
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,而且封装了常用数据库操作,使用比较简单
详细使用方式参考 链接
多主键、索引等高级配置请使用IEntityTypeConfiguration 参考fluentApi
数据库读写分离在大型项目中十分常见,通常在数据库层完成自动读写分离
…这个简单实用强大的框架希望能够帮助到大家,力求为.NET生态贡献一份力,大家一起壮大.NET生态
欢迎使用本框架,若觉得不错,请比心
Github欢迎星星:
博客园欢迎点赞:
QQ群3:940069478
个人QQ:862520575(欢迎技术支持及商务合作)
本人将会对这个快速开发框架不断完善与维护,希望能够帮助到各位 若遇到任何问题或需要技术支持,请联系我 ------学习永无止境,技术永无上限,代码就是艺术------
暂无开放 Issues,或尚未同步最近议题。