旅游交友的网站建设cn的wordpress包
web/
2025/9/27 10:54:21/
文章来源:
旅游交友的网站建设,cn的wordpress包,文件外链网站,ppt 模板免费下载简介本框架旨在为EF Core提供Sharding(即读写分离分库分表)支持,不仅提供了一套强大的普通数据操作接口,并且降低了分表难度,支持按时间自动分表扩容,提供的操作接口简洁统一.源码地址:EFCore.SHarding引言读写分离分库分表一直是数据库领域中的重难点,当数据规模达到单库极限的… 简介本框架旨在为EF Core提供Sharding(即读写分离分库分表)支持,不仅提供了一套强大的普通数据操作接口,并且降低了分表难度,支持按时间自动分表扩容,提供的操作接口简洁统一.源码地址:EFCore.SHarding引言读写分离分库分表一直是数据库领域中的重难点,当数据规模达到单库极限的时候,就不得不考虑分表方案。EF Core作为.NET Core中最为主流的ORM,用起来十分方便快捷,但是官方并没有相应的Sharding支持,鄙人不才,经过一番摸索之后终于完成这个框架.开始准备首先根据需要安装对应的Nuget包包名说明EFCore.Sharding必装包,3.x版本对应EF Core3.x,2.x版本对应EF Core2.xEFCore.Sharding.MySqlMySql支持EFCore.Sharding.PostgreSqlPostgreSql支持EFCore.Sharding.SQLiteSQLite支持EFCore.Sharding.SqlServerSqlServer支持EFCore.Sharding.OracleOracle支持(暂不支持3.x)配置class Base_UnitTestShardingRule : ModShardingRuleBase_UnitTest
{protected override string KeyField Id;protected override int Mod 3;
}ShardingConfig.Init(config
{config.AddAbsDb(DatabaseType.SQLite).AddPhysicDb(ReadWriteType.Read | ReadWriteType.Write, DataSourcedb.db).AddPhysicDbGroup().AddPhysicTableBase_UnitTest(Base_UnitTest_0).AddPhysicTableBase_UnitTest(Base_UnitTest_1).AddPhysicTableBase_UnitTest(Base_UnitTest_2).SetShardingRule(new Base_UnitTestShardingRule());
});
上述代码中完成了Sharding配置AddAbsDb是指添加抽象数据库,抽象数据库就是将多个分库看成同一个数据库来进行操作AddPhysicDbGroup是指添加物理数据库组,在同一组物理数据库中,它们数据库类型相同,拥有的表相同,每个数据库拥有的数据是一致的(之间通过主主复制或主从复制进行数据同步)AddPhysicTable是指添加物理数据表,传入的Base_UnitTest是抽象数据表(即将Base_UnitTest拆分为Base_UnitTest_0~2)Base_UnitTestShardingRule是采用的分表规则,上述代码中采用的是哈希取模的分表方式使用配置完成下面开始使用使用方式非常简单与平常使用基本一致首先获取分片仓储接口IShardingRepositoryIShardingRepository _db DbFactory.GetRepository().ToSharding();
然后即可进行数据操作Base_UnitTest _newData new Base_UnitTest
{Id Guid.NewGuid().ToString(),UserId Admin,UserName 超级管理员,Age 22
};
ListBase_UnitTest _insertList new ListBase_UnitTest
{new Base_UnitTest{Id Guid.NewGuid().ToString(),UserId Admin1,UserName 超级管理员1,Age 22},new Base_UnitTest{Id Guid.NewGuid().ToString(),UserId Admin2,UserName 超级管理员2,Age 22}
};
//添加单条数据
_db.Insert(_newData);
//添加多条数据
_db.Insert(_insertList);
//清空表
_db.DeleteAllBase_UnitTest();
//删除单条数据
_db.Delete(_newData);
//删除多条数据
_db.Delete(_insertList);
//删除指定数据
_db.DeleteBase_UnitTest(x x.UserId Admin2);
//更新单条数据
_db.Update(_newData);
//更新多条数据
_db.Update(_insertList);
//更新单条数据指定属性
_db.UpdateAny(_newData, new Liststring { UserName, Age });
//更新多条数据指定属性
_db.UpdateAny(_insertList, new Liststring { UserName, Age });
//更新指定条件数据
_db.UpdateWhereBase_UnitTest(x x.UserId Admin, x
{x.UserId Admin2;
});
//GetList获取表的所有数据
var list_db.GetListBase_UnitTest();
//GetIQPagination获取分页后的数据
var list_db.GetIShardingQueryableBase_UnitTest().GetPagination(pagination);
//Max
var max_db.GetIShardingQueryableBase_UnitTest().Max(x x.Age);
//Min
var min_db.GetIShardingQueryableBase_UnitTest().Min(x x.Age);
//Average
var min_db.GetIShardingQueryableBase_UnitTest().Average(x x.Age);
//Count
var min_db.GetIShardingQueryableBase_UnitTest().Count();
//事务,使用方式与普通事务一致
bool succcess _db.RunTransaction(()
{_db.Insert(_newData);var newData2 _newData.DeepClone();_db.Insert(newData2);
}).Success;
Assert.AreEqual(succcess, false);
上述操作中表面上是操作Base_UnitTest表实际上却在按照一定规则使用Base_UnitTest_0~2三张表使分片对业务操作透明极大提高开发效率具体使用方式请参考单元测试源码连接按时间自动分表上面的哈希取模的方式虽然简单,但是却十分不实用,因为当3张分表到达瓶颈时,将会面临扩容的问题这种方式扩容需要进行大量的数据迁移这无疑是十分麻烦的。因此需要一种方式能够系统自动建表扩容并且无需人工干预这就是按时间自动分表.using Demo.Common;
using EFCore.Sharding;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;namespace Demo.AutoExpandByDate
{class Base_UnitTestShardingRule : AbsShardingRuleBase_UnitTest{public override DateTime BuildDate(Base_UnitTest obj){return obj.CreateTime;}}class Program{/// summary/// 表都在同一个数据库中/// /summarypublic static void OneGroup(){DateTime startTime DateTime.Now.AddMinutes(-5);DateTime endTime DateTime.MaxValue;//配置初始化ShardingConfig.Init(config {config.AddAbsDb(DatabaseType.SqlServer)//添加抽象数据库.AddPhysicDbGroup()//添加物理数据库组.AddPhysicDb(ReadWriteType.Read | ReadWriteType.Write, Config.ConString1)//添加物理数据库1.SetShardingRule(new Base_UnitTestShardingRule())//设置分表规则.AutoExpandByDateBase_UnitTest(//设置为按时间自动分表ExpandByDateMode.PerMinute,(startTime, endTime, ShardingConfig.DefaultDbGourpName));});var db DbFactory.GetShardingRepository();while (true){db.Insert(new Base_UnitTest{Id Guid.NewGuid().ToString(),Age 1,UserName Guid.NewGuid().ToString(),CreateTime DateTime.Now});var count db.GetIShardingQueryableBase_UnitTest().Count();Console.WriteLine($当前数据量:{count});Thread.Sleep(50);}}/// summary/// 表分布在两个数据库测试/// /summarypublic static void TwoGroup(){DateTime startTime1 DateTime.Now.AddMinutes(-5);DateTime endTime1 DateTime.Now.AddMinutes(5);DateTime startTime2 endTime1;DateTime endTime2 DateTime.MaxValue;string group1 group1;string group2 group2;//配置初始化ShardingConfig.Init(config {config.AddAbsDb(DatabaseType.SqlServer)//添加抽象数据库.AddPhysicDbGroup(group1)//添加物理数据库组1.AddPhysicDbGroup(group2)//添加物理数据库组2.AddPhysicDb(ReadWriteType.Read | ReadWriteType.Write, Config.ConString1, group1)//添加物理数据库1.AddPhysicDb(ReadWriteType.Read | ReadWriteType.Write, Config.ConString2, group2)//添加物理数据库2.SetShardingRule(new Base_UnitTestShardingRule())//设置分表规则.AutoExpandByDateBase_UnitTest(//设置为按时间自动分表ExpandByDateMode.PerMinute,(startTime1, endTime1, group1),(startTime2, endTime2, group2));});ListTask tasks new ListTask();for (int i 0; i 4; i){tasks.Add(Task.Run(() {var db DbFactory.GetShardingRepository();while (true){db.Insert(new Base_UnitTest{Id Guid.NewGuid().ToString(),Age 1,UserName Guid.NewGuid().ToString(),CreateTime DateTime.Now});var count db.GetIShardingQueryableBase_UnitTest().Count();Console.WriteLine($当前数据量:{count});Thread.Sleep(50);}}));}Console.ReadLine();}static void Main(string[] args){OneGroup();Console.ReadLine();}}
}
上面Demo都在源码中上面的代码实现了将Base_UnitTest表按照时间自动分表每分钟创建一张表实际使用中根据业务需求设置ExpandByDateMode参数常用按天、按月分表自动分表效果全程无需人工干预系统会自动定时创建分表十分简单好用性能测试using Demo.Common;
using EFCore.Sharding;
using System;
using System.Diagnostics;
using System.Linq;namespace Demo.Performance
{class Base_UnitTestShardingRule : ModShardingRuleBase_UnitTest{protected override string KeyField Id;protected override int Mod 3;}class Program{static void Main(string[] args){ShardingConfig.Init(config {config.AddAbsDb(DatabaseType.SqlServer).AddPhysicDb(ReadWriteType.Read | ReadWriteType.Write, Config.ConString1).AddPhysicDbGroup().AddPhysicTableBase_UnitTest(Base_UnitTest_0).AddPhysicTableBase_UnitTest(Base_UnitTest_1).AddPhysicTableBase_UnitTest(Base_UnitTest_2).SetShardingRule(new Base_UnitTestShardingRule());});var db DbFactory.GetRepository(Config.ConString1, DatabaseType.SqlServer);Stopwatch watch new Stopwatch();var q db.GetIQueryableBase_UnitTest().Where(x x.UserName.Contains(00001C22-8DD2-4D47-B500-407554B099AB)).OrderByDescending(x x.Id).Skip(0).Take(30);q.ToList();q.ToSharding().ToList();watch.Restart();var list1 q.ToList();watch.Stop();Console.WriteLine($未分表耗时:{watch.ElapsedMilliseconds}ms);watch.Restart();var list2 q.ToSharding().ToList();watch.Stop();Console.WriteLine($分表后耗时:{watch.ElapsedMilliseconds}ms);Console.WriteLine(完成);}}
}
分表Base_UnitTest_0-2各有100万数据,然后将这三张表的数据导入Base_UnitTest中(即Base_UnitTest表的数据与Base_UnitTest_0-2三张表总合数据一致)分表与不分表测试结果如下这里仅仅分了3张表其效果立杆见影若分表几十张那效果想想就很棒其它简单操作(非Sharing)框架不仅支持Sharing,而且封装了常用数据库操作,使用比较简单详细使用方式参考 链接总结这个简单实用强大的框架希望能够帮助到大家,力求为.NET生态贡献一份力,大家一起壮大.NET生态欢迎使用本框架若觉得不错请比心Github欢迎星星:https://github.com/Coldairarrow博客园欢迎点赞https://www.cnblogs.com/coldairarrow/QQ群3:940069478个人QQ:862520575欢迎技术支持及商务合作提供.NET Core Linux Nginx jenkins git整套持续集成快速开发平台
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82723.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!