From 6af0fd8896bef7120f741b664813fc3b9f65981e Mon Sep 17 00:00:00 2001 From: xuejmnet <326308290@qq.com> Date: Sun, 22 Aug 2021 18:21:39 +0800 Subject: [PATCH] test mysql unit test and support single node read single node write --- .gitignore | 2 +- README.md | 28 ++++++++++++++++--- samples/Sample.SqlServer/Startup.cs | 2 +- .../AbstractShardingAbpDbContext.cs | 3 +- .../IShardingDbContextOptionsBuilderConfig.cs | 2 +- .../Sharding/AbstractShardingDbContext.cs | 3 +- .../ShardingDbContextOptionsBuilderConfig.cs | 8 +++--- src/ShardingCore/ShardingConfigOption.cs | 4 +-- .../ShardingCore.Test50/Configs/DbConfig.json | 4 +++ .../ShardingCore.Test50.csproj | 1 + test/ShardingCore.Test50/Startup.cs | 16 +++++++++-- .../ShardingCore.Test50_2x.csproj | 1 - test/ShardingCore.Test50_2x/Startup.cs | 6 ++-- .../ShardingCore.Test50_3x.csproj | 1 - test/ShardingCore.Test50_3x/Startup.cs | 6 ++-- 15 files changed, 61 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index c1338bd1..c9c84563 100644 --- a/.gitignore +++ b/.gitignore @@ -343,4 +343,4 @@ healthchecksdb /src/Bd.ShopRent.Api/Properties/launchSettings.json /src/Bd.ShopRent.DTO/__autoDTOConfig.json /src/Bd.ShopRent.DTO/Bd.ShopRent.Dto.csproj -/test/ShardingCore.Test50/Configs/* +MacDbConfig.json diff --git a/README.md b/README.md index 692a439b..5fc0342a 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Release | EF Core | .NET Standard | .NET (Core) ### 数据库支持 数据库 | 是否支持 | 支持情况 --- | --- | --- -SqlServer | 是 | 80%近乎完美 +SqlServer | 是 | 90%近乎完美 MySql |支持 | 未测试 PostgreSql | 支持 | 未测试 SQLite | 支持 | 未测试 @@ -40,6 +40,7 @@ Oracle | 支持 | 未测试 - [自动建表](#自动建表) - [事务](#事务) - [批量操作](#批量操作) + - [读写分离](#读写分离) - [注意事项](#注意事项) - [计划(Future)](#计划) - [最后](#最后) @@ -94,7 +95,11 @@ Oracle | 支持 | 未测试 ## 安装 ```xml - + +or + +or + ``` ## 配置 @@ -154,7 +159,7 @@ Oracle | 支持 | 未测试 modelBuilder.ApplyConfiguration(new SysTestMap()); } - public string ModelChangeKey { get; set; } + public IRouteTail RouteTail { get; set; } } ``` @@ -196,7 +201,6 @@ Oracle | 支持 | 未测试 { op.EnsureCreatedWithOutShardingTable = true; op.CreateShardingTableOnStart = true; - //不支持mars额外加一条字符串的 op.UseShardingOptionsBuilder( (connection, builder) => builder.UseSqlServer(connection).UseLoggerFactory(efLogger), builder => builder.UseSqlServer("Data Source=localhost;Initial Catalog=ShardingCoreDBxx2;Integrated Security=True;").UseLoggerFactory(efLogger)); @@ -308,6 +312,22 @@ AbstractSimpleShardingYearKeyLongVirtualTableRoute |按时间戳 |yyyy | `>,>=,< tran.commit() ``` +## 读写分离 +该框架目前已经支持单node的读写分离,后续框架将支持多node的读 + +```c# + + services.AddShardingDbContext(o => o.UseSqlServer(hostBuilderContext.Configuration.GetSection("SqlServer")["ConnectionString"]) + ,op => + { + op.EnsureCreatedWithOutShardingTable = true; + op.CreateShardingTableOnStart = true; + op.UseShardingOptionsBuilder((connection, builder) => builder.UseSqlServer("write db connection string").UseLoggerFactory(efLogger), + (conStr,builder)=> builder.UseSqlServer("read db connection string").UseLoggerFactory(efLogger)); + op.AddShardingTableRoute(); + op.AddShardingTableRoute(); + }); +``` # 注意事项 该库的追踪是基于adonet的MARS(MultipleActiveResultSets=True;)所以基本不支持该特性的无法支持完美追踪 diff --git a/samples/Sample.SqlServer/Startup.cs b/samples/Sample.SqlServer/Startup.cs index c7983613..a2a101f6 100644 --- a/samples/Sample.SqlServer/Startup.cs +++ b/samples/Sample.SqlServer/Startup.cs @@ -31,7 +31,7 @@ namespace Sample.SqlServer op.EnsureCreatedWithOutShardingTable = true; op.CreateShardingTableOnStart = true; op.UseShardingOptionsBuilder((connection, builder) => builder.UseSqlServer(connection).UseLoggerFactory(efLogger), - builder => builder.UseSqlServer("Data Source=localhost;Initial Catalog=ShardingCoreDBxx2;Integrated Security=True;").UseLoggerFactory(efLogger)); + (conStr,builder) => builder.UseSqlServer(conStr).UseLoggerFactory(efLogger)); op.AddShardingTableRoute(); }); ////不支持MARS不支持追踪的 diff --git a/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs b/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs index c18e262f..f7528579 100644 --- a/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs +++ b/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs @@ -65,7 +65,8 @@ namespace Samples.AbpSharding private DbContextOptions CreateMonopolyDbContextOptions() { var dbContextOptionBuilder = CreateDbContextOptionBuilder(); - _shardingDbContextOptionsBuilderConfig.UseDbContextOptionsBuilder(dbContextOptionBuilder); + var connectionString = Database.GetConnectionString(); + _shardingDbContextOptionsBuilderConfig.UseDbContextOptionsBuilder(connectionString,dbContextOptionBuilder); return dbContextOptionBuilder.Options; } diff --git a/src/ShardingCore/IShardingDbContextOptionsBuilderConfig.cs b/src/ShardingCore/IShardingDbContextOptionsBuilderConfig.cs index d00d1e44..b77ffd82 100644 --- a/src/ShardingCore/IShardingDbContextOptionsBuilderConfig.cs +++ b/src/ShardingCore/IShardingDbContextOptionsBuilderConfig.cs @@ -17,6 +17,6 @@ namespace ShardingCore { Type ShardingDbContextType { get; } DbContextOptionsBuilder UseDbContextOptionsBuilder(DbConnection dbConnection, DbContextOptionsBuilder dbContextOptionsBuilder); - DbContextOptionsBuilder UseDbContextOptionsBuilder(DbContextOptionsBuilder dbContextOptionsBuilder); + DbContextOptionsBuilder UseDbContextOptionsBuilder(string connectionString,DbContextOptionsBuilder dbContextOptionsBuilder); } } diff --git a/src/ShardingCore/Sharding/AbstractShardingDbContext.cs b/src/ShardingCore/Sharding/AbstractShardingDbContext.cs index 3fab56be..b16ef452 100644 --- a/src/ShardingCore/Sharding/AbstractShardingDbContext.cs +++ b/src/ShardingCore/Sharding/AbstractShardingDbContext.cs @@ -77,7 +77,8 @@ namespace ShardingCore.Sharding private DbContextOptions CreateMonopolyDbContextOptions() { var dbContextOptionBuilder = CreateDbContextOptionBuilder(); - _shardingDbContextOptionsBuilderConfig.UseDbContextOptionsBuilder(dbContextOptionBuilder); + var connectionString = Database.GetDbConnection().ConnectionString; + _shardingDbContextOptionsBuilderConfig.UseDbContextOptionsBuilder(connectionString,dbContextOptionBuilder); return dbContextOptionBuilder.Options; } diff --git a/src/ShardingCore/Sharding/ShardingDbContextOptionsBuilderConfig.cs b/src/ShardingCore/Sharding/ShardingDbContextOptionsBuilderConfig.cs index 5e29152b..535a5e94 100644 --- a/src/ShardingCore/Sharding/ShardingDbContextOptionsBuilderConfig.cs +++ b/src/ShardingCore/Sharding/ShardingDbContextOptionsBuilderConfig.cs @@ -16,13 +16,13 @@ namespace ShardingCore.Sharding */ public class ShardingDbContextOptionsBuilderConfig : IShardingDbContextOptionsBuilderConfig where TShardingDbContext : DbContext, IShardingDbContext { - public ShardingDbContextOptionsBuilderConfig(Action sameConnectionDbContextOptionsCreator, Action defaultQueryDbContextOptionsCreator) + public ShardingDbContextOptionsBuilderConfig(Action sameConnectionDbContextOptionsCreator, Action defaultQueryDbContextOptionsCreator) { SameConnectionDbContextOptionsCreator = sameConnectionDbContextOptionsCreator; DefaultQueryDbContextOptionsCreator = defaultQueryDbContextOptionsCreator; } public Action SameConnectionDbContextOptionsCreator { get; } - public Action DefaultQueryDbContextOptionsCreator { get; } + public Action DefaultQueryDbContextOptionsCreator { get; } public Type ShardingDbContextType => typeof(TShardingDbContext); public DbContextOptionsBuilder UseDbContextOptionsBuilder(DbConnection dbConnection, DbContextOptionsBuilder dbContextOptionsBuilder) @@ -32,9 +32,9 @@ namespace ShardingCore.Sharding return dbContextOptionsBuilder; } - public DbContextOptionsBuilder UseDbContextOptionsBuilder(DbContextOptionsBuilder dbContextOptionsBuilder) + public DbContextOptionsBuilder UseDbContextOptionsBuilder(string connectionString,DbContextOptionsBuilder dbContextOptionsBuilder) { - DefaultQueryDbContextOptionsCreator(dbContextOptionsBuilder); + DefaultQueryDbContextOptionsCreator(connectionString,dbContextOptionsBuilder); dbContextOptionsBuilder.UseInnerDbContextSharding(); return dbContextOptionsBuilder; } diff --git a/src/ShardingCore/ShardingConfigOption.cs b/src/ShardingCore/ShardingConfigOption.cs index f2a0843f..f8ae5cdf 100644 --- a/src/ShardingCore/ShardingConfigOption.cs +++ b/src/ShardingCore/ShardingConfigOption.cs @@ -26,14 +26,14 @@ namespace ShardingCore private readonly Dictionary _virtualRoutes = new Dictionary(); public Action SameConnectionConfigure { get; set; } - public Action DefaultQueryConfigure { get; set; } + public Action DefaultQueryConfigure { get; set; } /// /// 配置数据库分表查询和保存时的DbContext创建方式 /// /// DbConnection下如何配置因为不同的DbContext支持事务需要使用同一个DbConnection /// 默认查询DbContext创建的配置 - public void UseShardingOptionsBuilder(Action sameConnectionConfigure, Action defaultQueryConfigure = null) + public void UseShardingOptionsBuilder(Action sameConnectionConfigure, Action defaultQueryConfigure = null) { SameConnectionConfigure = sameConnectionConfigure ?? throw new ArgumentNullException(nameof(sameConnectionConfigure)); DefaultQueryConfigure = defaultQueryConfigure ?? throw new ArgumentNullException(nameof(defaultQueryConfigure)); diff --git a/test/ShardingCore.Test50/Configs/DbConfig.json b/test/ShardingCore.Test50/Configs/DbConfig.json index f305cd6d..f131dbfd 100644 --- a/test/ShardingCore.Test50/Configs/DbConfig.json +++ b/test/ShardingCore.Test50/Configs/DbConfig.json @@ -1,5 +1,9 @@ { "SqlServer": { "ConnectionString": "Data Source=localhost;Initial Catalog=ShardingCoreDB;Integrated Security=True;" + }, + "MySql": { + "ConnectionString": "server=127.0.0.1;port=3306;user=root;password=root;database=ShardingCoreDB;sslMode=None;" } + } \ No newline at end of file diff --git a/test/ShardingCore.Test50/ShardingCore.Test50.csproj b/test/ShardingCore.Test50/ShardingCore.Test50.csproj index c31970f9..69a92fa1 100644 --- a/test/ShardingCore.Test50/ShardingCore.Test50.csproj +++ b/test/ShardingCore.Test50/ShardingCore.Test50.csproj @@ -9,6 +9,7 @@ + diff --git a/test/ShardingCore.Test50/Startup.cs b/test/ShardingCore.Test50/Startup.cs index e1244418..24d18235 100644 --- a/test/ShardingCore.Test50/Startup.cs +++ b/test/ShardingCore.Test50/Startup.cs @@ -51,13 +51,23 @@ namespace ShardingCore.Test50 services.AddShardingDbContext(o => o.UseSqlServer(hostBuilderContext.Configuration.GetSection("SqlServer")["ConnectionString"]) ,op => { - op.EnsureCreatedWithOutShardingTable = false; - op.CreateShardingTableOnStart = false; + op.EnsureCreatedWithOutShardingTable = true; + op.CreateShardingTableOnStart = true; op.UseShardingOptionsBuilder((connection, builder) => builder.UseSqlServer(connection).UseLoggerFactory(efLogger), - builder=> builder.UseSqlServer(hostBuilderContext.Configuration.GetSection("SqlServer")["ConnectionString"]).UseLoggerFactory(efLogger)); + (conStr,builder)=> builder.UseSqlServer(conStr).UseLoggerFactory(efLogger)); op.AddShardingTableRoute(); op.AddShardingTableRoute(); }); + // services.AddShardingDbContext(o => o.UseMySql(hostBuilderContext.Configuration.GetSection("MySql")["ConnectionString"],new MySqlServerVersion("5.7.15")) + // ,op => + // { + // op.EnsureCreatedWithOutShardingTable = true; + // op.CreateShardingTableOnStart = true; + // op.UseShardingOptionsBuilder((connection, builder) => builder.UseMySql(connection,new MySqlServerVersion("5.7.15")).UseLoggerFactory(efLogger), + // (conStr,builder)=> builder.UseMySql(conStr,new MySqlServerVersion("5.7.15")).UseLoggerFactory(efLogger)); + // op.AddShardingTableRoute(); + // op.AddShardingTableRoute(); + // }); } // 可以添加要用到的方法参数,会自动从注册的服务中获取服务实例,类似于 asp.net core 里 Configure 方法 diff --git a/test/ShardingCore.Test50_2x/ShardingCore.Test50_2x.csproj b/test/ShardingCore.Test50_2x/ShardingCore.Test50_2x.csproj index 41ae8941..8fbc62be 100644 --- a/test/ShardingCore.Test50_2x/ShardingCore.Test50_2x.csproj +++ b/test/ShardingCore.Test50_2x/ShardingCore.Test50_2x.csproj @@ -23,7 +23,6 @@ PreserveNewest - diff --git a/test/ShardingCore.Test50_2x/Startup.cs b/test/ShardingCore.Test50_2x/Startup.cs index b08fceae..d509627a 100644 --- a/test/ShardingCore.Test50_2x/Startup.cs +++ b/test/ShardingCore.Test50_2x/Startup.cs @@ -44,10 +44,10 @@ namespace ShardingCore.Test50_2x services.AddShardingDbContext(o => o.UseSqlServer(hostBuilderContext.Configuration.GetSection("SqlServer")["ConnectionString"]) ,op => { - op.EnsureCreatedWithOutShardingTable = false; - op.CreateShardingTableOnStart = false; + op.EnsureCreatedWithOutShardingTable = true; + op.CreateShardingTableOnStart = true; op.UseShardingOptionsBuilder((connection, builder) => builder.UseSqlServer(connection).UseLoggerFactory(efLogger), - builder=> builder.UseSqlServer(hostBuilderContext.Configuration.GetSection("SqlServer")["ConnectionString"]).UseLoggerFactory(efLogger)); + (conStr,builder)=> builder.UseSqlServer(conStr).UseLoggerFactory(efLogger)); op.AddShardingTableRoute(); op.AddShardingTableRoute(); }); diff --git a/test/ShardingCore.Test50_3x/ShardingCore.Test50_3x.csproj b/test/ShardingCore.Test50_3x/ShardingCore.Test50_3x.csproj index 43531edf..3235172d 100644 --- a/test/ShardingCore.Test50_3x/ShardingCore.Test50_3x.csproj +++ b/test/ShardingCore.Test50_3x/ShardingCore.Test50_3x.csproj @@ -22,7 +22,6 @@ PreserveNewest - diff --git a/test/ShardingCore.Test50_3x/Startup.cs b/test/ShardingCore.Test50_3x/Startup.cs index 4e09c77f..53d8f78f 100644 --- a/test/ShardingCore.Test50_3x/Startup.cs +++ b/test/ShardingCore.Test50_3x/Startup.cs @@ -44,10 +44,10 @@ namespace ShardingCore.Test50_3x services.AddShardingDbContext(o => o.UseSqlServer(hostBuilderContext.Configuration.GetSection("SqlServer")["ConnectionString"]) ,op => { - op.EnsureCreatedWithOutShardingTable = false; - op.CreateShardingTableOnStart = false; + op.EnsureCreatedWithOutShardingTable = true; + op.CreateShardingTableOnStart = true; op.UseShardingOptionsBuilder((connection, builder) => builder.UseSqlServer(connection).UseLoggerFactory(efLogger), - builder=> builder.UseSqlServer(hostBuilderContext.Configuration.GetSection("SqlServer")["ConnectionString"]).UseLoggerFactory(efLogger)); + (conStr,builder)=> builder.UseSqlServer(conStr).UseLoggerFactory(efLogger)); op.AddShardingTableRoute(); op.AddShardingTableRoute(); });