From 89a8e66a6fb4b07d4456ce3f0d4c30ba26ccd744 Mon Sep 17 00:00:00 2001 From: xuejiaming <326308290@qq.com> Date: Sun, 3 Jul 2022 17:25:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=AE=8C=E6=88=90=E7=BC=96?= =?UTF-8?q?=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ShardingCoreBenchmark/EFCoreCrud.cs | 14 +- .../ShardingCoreBenchmark5x/EFCoreCrud.cs | 32 +- .../AreaDeviceRoute.cs | 306 +++++++-------- .../OrderByHourRoute.cs | 368 +++++++++--------- samples/Sample.AutoCreateIfPresent/Program.cs | 4 +- 5 files changed, 349 insertions(+), 375 deletions(-) diff --git a/benchmarks/ShardingCoreBenchmark/EFCoreCrud.cs b/benchmarks/ShardingCoreBenchmark/EFCoreCrud.cs index 471ff4ed..0e1544a2 100644 --- a/benchmarks/ShardingCoreBenchmark/EFCoreCrud.cs +++ b/benchmarks/ShardingCoreBenchmark/EFCoreCrud.cs @@ -2,8 +2,6 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using ShardingCore; -using ShardingCore.Bootstrappers; -using ShardingCore.Core.VirtualDatabase.VirtualTables; using ShardingCore.Extensions; using ShardingCore6x.NoShardingDbContexts; using ShardingCore6x.ShardingDbContexts; @@ -16,7 +14,6 @@ namespace ShardingCore6x { private readonly DefaultDbContext _defaultDbContext; private readonly DefaultShardingDbContext _defaultShardingDbContext; - private readonly IVirtualTableManager _virtualTableManager; public EFCoreCrud() { var services = new ServiceCollection(); @@ -30,13 +27,10 @@ namespace ShardingCore6x services.AddShardingDbContext(ServiceLifetime.Transient, ServiceLifetime.Transient) .AddEntityConfig(o => { - o.CreateShardingTableOnStart = true; - o.EnsureCreatedWithOutShardingTable = true; o.AddShardingTableRoute(); }) .AddConfig(op => { - op.ConfigId = "c1"; op.UseShardingQuery((conStr, builder) => { builder.UseSqlServer(conStr); @@ -55,7 +49,8 @@ namespace ShardingCore6x }).EnsureConfig(); var buildServiceProvider = services.BuildServiceProvider(); - buildServiceProvider.GetRequiredService().Start(); + buildServiceProvider.UseAutoShardingCreate(); + buildServiceProvider.UseAutoTryCompensateTable(); ICollection orders = new LinkedList(); using (var scope = buildServiceProvider.CreateScope()) @@ -106,9 +101,8 @@ namespace ShardingCore6x Console.WriteLine($"批量插入订单数据:{orders.Count},用时:{sp.ElapsedMilliseconds}"); } } - _defaultDbContext = ShardingContainer.GetService(); - _defaultShardingDbContext = ShardingContainer.GetService(); - _virtualTableManager = ShardingContainer.GetService>(); + _defaultDbContext = buildServiceProvider.GetService(); + _defaultShardingDbContext = buildServiceProvider.GetService(); } diff --git a/benchmarks/ShardingCoreBenchmark5x/EFCoreCrud.cs b/benchmarks/ShardingCoreBenchmark5x/EFCoreCrud.cs index b2dd7667..bd359b00 100644 --- a/benchmarks/ShardingCoreBenchmark5x/EFCoreCrud.cs +++ b/benchmarks/ShardingCoreBenchmark5x/EFCoreCrud.cs @@ -8,14 +8,10 @@ using EFCore.BulkExtensions; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using ShardingCore; -using ShardingCore.Bootstrappers; -using ShardingCore.Core.VirtualDatabase.VirtualTables; -using ShardingCore.Core.VirtualRoutes.TableRoutes; using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions; -using ShardingCore.Core.VirtualTables; using ShardingCore.Extensions; -using ShardingCore.Sharding.Abstractions; using ShardingCore.TableExists; +using ShardingCore.TableExists.Abstractions; using ShardingCoreBenchmark5x.NoShardingDbContexts; using ShardingCoreBenchmark5x.ShardingDbContexts; @@ -25,10 +21,6 @@ namespace ShardingCoreBenchmark5x { private readonly DefaultDbContext _defaultDbContext; private readonly DefaultShardingDbContext _defaultShardingDbContext; - private readonly IVirtualTableManager _virtualTableManager; - private readonly IVirtualTable _virtualTable; - private readonly IRouteTailFactory _routeTailFactory; - private readonly IStreamMergeContextFactory _streamMergeContextFactory; public EFCoreCrud() { var services = new ServiceCollection(); @@ -38,13 +30,10 @@ namespace ShardingCoreBenchmark5x services.AddShardingDbContext(ServiceLifetime.Transient, ServiceLifetime.Transient) .AddEntityConfig(o => { - o.CreateShardingTableOnStart = true; - o.EnsureCreatedWithOutShardingTable = true; o.AddShardingTableRoute(); }) .AddConfig(op => { - op.ConfigId = "c1"; op.UseShardingQuery((conStr, builder) => { builder.UseSqlServer(conStr); @@ -53,14 +42,14 @@ namespace ShardingCoreBenchmark5x { builder.UseSqlServer(connection); }); - op.ReplaceTableEnsureManager(sp => new SqlServerTableEnsureManager()); op.AddDefaultDataSource("ds0", "Data Source=localhost;Initial Catalog=db2;Integrated Security=True;"); - }).EnsureConfig(); + }).ReplaceService().EnsureConfig(); var buildServiceProvider = services.BuildServiceProvider(); - buildServiceProvider.GetRequiredService().Start(); + buildServiceProvider.UseAutoShardingCreate(); + buildServiceProvider.UseAutoTryCompensateTable(); ICollection orders = new LinkedList(); using (var scope = buildServiceProvider.CreateScope()) @@ -111,17 +100,8 @@ namespace ShardingCoreBenchmark5x Console.WriteLine($"批量插入订单数据:{orders.Count},用时:{sp.ElapsedMilliseconds}"); } } - _defaultDbContext = ShardingContainer.GetService(); - _defaultShardingDbContext = ShardingContainer.GetService(); - _virtualTableManager = ShardingContainer.GetService>(); - _virtualTable = _virtualTableManager.GetVirtualTable(); - _routeTailFactory= ShardingContainer.GetService(); - _streamMergeContextFactory = - ShardingContainer.GetService>(); - var queryable1 = _defaultShardingDbContext.Set().Where(o => o.Id == "0"); - _virtualTable.RouteTo(new ShardingTableRouteConfig(queryable: queryable1)); - var queryable = _defaultShardingDbContext.Set().Where(o => o.Id == "1000"); - _virtualTable.RouteTo(new ShardingTableRouteConfig(queryable: queryable)); + _defaultDbContext = buildServiceProvider.GetService(); + _defaultShardingDbContext = buildServiceProvider.GetService(); } diff --git a/samples/Sample.AutoCreateIfPresent/AreaDeviceRoute.cs b/samples/Sample.AutoCreateIfPresent/AreaDeviceRoute.cs index 8293a016..2dfda3c4 100644 --- a/samples/Sample.AutoCreateIfPresent/AreaDeviceRoute.cs +++ b/samples/Sample.AutoCreateIfPresent/AreaDeviceRoute.cs @@ -1,153 +1,153 @@ -using System.Collections.Concurrent; -using System.Linq.Expressions; -using MySqlConnector; -using Newtonsoft.Json; -using ShardingCore.Core.EntityMetadatas; -using ShardingCore.Core.PhysicTables; -using ShardingCore.Core.VirtualDatabase.VirtualDataSources.Abstractions; -using ShardingCore.Core.VirtualDatabase.VirtualTables; -using ShardingCore.Core.VirtualRoutes; -using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions; -using ShardingCore.Exceptions; -using ShardingCore.Extensions; -using ShardingCore.TableCreator; - -namespace Sample.AutoCreateIfPresent -{ - public class AreaDeviceRoute : AbstractShardingOperatorVirtualTableRoute - { - private const string Tables = "Tables"; - private const string TABLE_SCHEMA = "TABLE_SCHEMA"; - private const string TABLE_NAME = "TABLE_NAME"; - - private const string CurrentTableName = nameof(AreaDevice); - private readonly IVirtualDataSourceManager _virtualDataSourceManager; - private readonly IVirtualTableManager _virtualTableManager; - private readonly IShardingTableCreator _shardingTableCreator; - private readonly ConcurrentDictionary _tails = new ConcurrentDictionary(); - private readonly object _lock = new object(); - - public AreaDeviceRoute(IVirtualDataSourceManager virtualDataSourceManager, IVirtualTableManager virtualTableManager, IShardingTableCreator shardingTableCreator) - { - _virtualDataSourceManager = virtualDataSourceManager; - _virtualTableManager = virtualTableManager; - _shardingTableCreator = shardingTableCreator; - } - - - public override string ShardingKeyToTail(object shardingKey) - { - return $"{shardingKey}"; - } - /// - /// 如果你是非mysql数据库请自行实现这个方法返回当前类在数据库已经存在的后缀 - /// 仅启动时调用 - /// - /// - public override List GetAllTails() - { - //启动寻找有哪些表后缀 - using (var connection = new MySqlConnection(_virtualDataSourceManager.GetCurrentVirtualDataSource().DefaultConnectionString)) - { - connection.Open(); - var database = connection.Database; - - using (var dataTable = connection.GetSchema(Tables)) - { - for (int i = 0; i < dataTable.Rows.Count; i++) - { - var schema = dataTable.Rows[i][TABLE_SCHEMA]; - if (database.Equals($"{schema}", StringComparison.OrdinalIgnoreCase)) - { - var tableName = dataTable.Rows[i][TABLE_NAME]?.ToString() ?? string.Empty; - if (tableName.StartsWith(CurrentTableName,StringComparison.OrdinalIgnoreCase)) - { - //如果没有下划线那么需要CurrentTableName.Length有下划线就要CurrentTableName.Length+1 - _tails.TryAdd(tableName.Substring(CurrentTableName.Length+1), null); - } - } - } - } - } - return _tails.Keys.ToList(); - } - - public override void Configure(EntityMetadataTableBuilder builder) - { - builder.ShardingProperty(o => o.Area); - } - - public override Func GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) - { - var t = ShardingKeyToTail(shardingKey); - switch (shardingOperator) - { - case ShardingOperatorEnum.Equal: return tail => tail == t; - default: - { -#if DEBUG - Console.WriteLine($"shardingOperator is not equal scan all table tail"); -#endif - return tail => true; - } - } - } - - public override IPhysicTable RouteWithValue(List allPhysicTables, object shardingKey) - { - var shardingKeyToTail = ShardingKeyToTail(shardingKey); - - if (!_tails.TryGetValue(shardingKeyToTail, out var _)) - { - lock (_lock) - { - if (!_tails.TryGetValue(shardingKeyToTail, out var _)) - { - var virtualTable = _virtualTableManager.GetVirtualTable(typeof(AreaDevice)); - _virtualTableManager.AddPhysicTable(virtualTable, new DefaultPhysicTable(virtualTable, shardingKeyToTail)); - try - { - _shardingTableCreator.CreateTable(_virtualDataSourceManager.GetCurrentVirtualDataSource().DefaultDataSourceName, shardingKeyToTail); - } - catch (Exception ex) - { - Console.WriteLine("尝试添加表失败" + ex); - } - - _tails.TryAdd(shardingKeyToTail, null); - } - } - } - - var needRefresh = allPhysicTables.Count != _tails.Count; - if (needRefresh) - { - var virtualTable = _virtualTableManager.GetVirtualTable(typeof(AreaDevice)); - //修复可能导致迭代器遍历时添加的bug - var keys = _tails.Keys.ToList(); - foreach (var tail in keys) - { - var hashSet = allPhysicTables.Select(o => o.Tail).ToHashSet(); - if (!hashSet.Contains(tail)) - { - var tables = virtualTable.GetAllPhysicTables(); - var physicTable = tables.FirstOrDefault(o => o.Tail == tail); - if (physicTable != null) - { - allPhysicTables.Add(physicTable); - } - } - } - } - var physicTables = allPhysicTables.Where(o => o.Tail == shardingKeyToTail).ToList(); - if (physicTables.IsEmpty()) - { - throw new ShardingCoreException($"sharding key route not match {EntityMetadata.EntityType} -> [{EntityMetadata.ShardingTableProperty.Name}] ->【{shardingKey}】 all tails ->[{string.Join(",", allPhysicTables.Select(o => o.FullName))}]"); - } - - if (physicTables.Count > 1) - throw new ShardingCoreException($"more than one route match table:{string.Join(",", physicTables.Select(o => $"[{o.FullName}]"))}"); - return physicTables[0]; - } - } -} \ No newline at end of file +// using System.Collections.Concurrent; +// using System.Linq.Expressions; +// using MySqlConnector; +// using Newtonsoft.Json; +// using ShardingCore.Core.EntityMetadatas; +// using ShardingCore.Core.PhysicTables; +// using ShardingCore.Core.VirtualDatabase.VirtualDataSources.Abstractions; +// using ShardingCore.Core.VirtualDatabase.VirtualTables; +// using ShardingCore.Core.VirtualRoutes; +// using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions; +// using ShardingCore.Exceptions; +// using ShardingCore.Extensions; +// using ShardingCore.TableCreator; +// +// namespace Sample.AutoCreateIfPresent +// { +// public class AreaDeviceRoute : AbstractShardingOperatorVirtualTableRoute +// { +// private const string Tables = "Tables"; +// private const string TABLE_SCHEMA = "TABLE_SCHEMA"; +// private const string TABLE_NAME = "TABLE_NAME"; +// +// private const string CurrentTableName = nameof(AreaDevice); +// private readonly IVirtualDataSourceManager _virtualDataSourceManager; +// private readonly IVirtualTableManager _virtualTableManager; +// private readonly IShardingTableCreator _shardingTableCreator; +// private readonly ConcurrentDictionary _tails = new ConcurrentDictionary(); +// private readonly object _lock = new object(); +// +// public AreaDeviceRoute(IVirtualDataSourceManager virtualDataSourceManager, IVirtualTableManager virtualTableManager, IShardingTableCreator shardingTableCreator) +// { +// _virtualDataSourceManager = virtualDataSourceManager; +// _virtualTableManager = virtualTableManager; +// _shardingTableCreator = shardingTableCreator; +// } +// +// +// public override string ShardingKeyToTail(object shardingKey) +// { +// return $"{shardingKey}"; +// } +// /// +// /// 如果你是非mysql数据库请自行实现这个方法返回当前类在数据库已经存在的后缀 +// /// 仅启动时调用 +// /// +// /// +// public override List GetAllTails() +// { +// //启动寻找有哪些表后缀 +// using (var connection = new MySqlConnection(_virtualDataSourceManager.GetCurrentVirtualDataSource().DefaultConnectionString)) +// { +// connection.Open(); +// var database = connection.Database; +// +// using (var dataTable = connection.GetSchema(Tables)) +// { +// for (int i = 0; i < dataTable.Rows.Count; i++) +// { +// var schema = dataTable.Rows[i][TABLE_SCHEMA]; +// if (database.Equals($"{schema}", StringComparison.OrdinalIgnoreCase)) +// { +// var tableName = dataTable.Rows[i][TABLE_NAME]?.ToString() ?? string.Empty; +// if (tableName.StartsWith(CurrentTableName,StringComparison.OrdinalIgnoreCase)) +// { +// //如果没有下划线那么需要CurrentTableName.Length有下划线就要CurrentTableName.Length+1 +// _tails.TryAdd(tableName.Substring(CurrentTableName.Length+1), null); +// } +// } +// } +// } +// } +// return _tails.Keys.ToList(); +// } +// +// public override void Configure(EntityMetadataTableBuilder builder) +// { +// builder.ShardingProperty(o => o.Area); +// } +// +// public override Func GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) +// { +// var t = ShardingKeyToTail(shardingKey); +// switch (shardingOperator) +// { +// case ShardingOperatorEnum.Equal: return tail => tail == t; +// default: +// { +// #if DEBUG +// Console.WriteLine($"shardingOperator is not equal scan all table tail"); +// #endif +// return tail => true; +// } +// } +// } +// +// public override IPhysicTable RouteWithValue(List allPhysicTables, object shardingKey) +// { +// var shardingKeyToTail = ShardingKeyToTail(shardingKey); +// +// if (!_tails.TryGetValue(shardingKeyToTail, out var _)) +// { +// lock (_lock) +// { +// if (!_tails.TryGetValue(shardingKeyToTail, out var _)) +// { +// var virtualTable = _virtualTableManager.GetVirtualTable(typeof(AreaDevice)); +// _virtualTableManager.AddPhysicTable(virtualTable, new DefaultPhysicTable(virtualTable, shardingKeyToTail)); +// try +// { +// _shardingTableCreator.CreateTable(_virtualDataSourceManager.GetCurrentVirtualDataSource().DefaultDataSourceName, shardingKeyToTail); +// } +// catch (Exception ex) +// { +// Console.WriteLine("尝试添加表失败" + ex); +// } +// +// _tails.TryAdd(shardingKeyToTail, null); +// } +// } +// } +// +// var needRefresh = allPhysicTables.Count != _tails.Count; +// if (needRefresh) +// { +// var virtualTable = _virtualTableManager.GetVirtualTable(typeof(AreaDevice)); +// //修复可能导致迭代器遍历时添加的bug +// var keys = _tails.Keys.ToList(); +// foreach (var tail in keys) +// { +// var hashSet = allPhysicTables.Select(o => o.Tail).ToHashSet(); +// if (!hashSet.Contains(tail)) +// { +// var tables = virtualTable.GetAllPhysicTables(); +// var physicTable = tables.FirstOrDefault(o => o.Tail == tail); +// if (physicTable != null) +// { +// allPhysicTables.Add(physicTable); +// } +// } +// } +// } +// var physicTables = allPhysicTables.Where(o => o.Tail == shardingKeyToTail).ToList(); +// if (physicTables.IsEmpty()) +// { +// throw new ShardingCoreException($"sharding key route not match {EntityMetadata.EntityType} -> [{EntityMetadata.ShardingTableProperty.Name}] ->【{shardingKey}】 all tails ->[{string.Join(",", allPhysicTables.Select(o => o.FullName))}]"); +// } +// +// if (physicTables.Count > 1) +// throw new ShardingCoreException($"more than one route match table:{string.Join(",", physicTables.Select(o => $"[{o.FullName}]"))}"); +// return physicTables[0]; +// } +// } +// } \ No newline at end of file diff --git a/samples/Sample.AutoCreateIfPresent/OrderByHourRoute.cs b/samples/Sample.AutoCreateIfPresent/OrderByHourRoute.cs index b0fd35ed..9318c248 100644 --- a/samples/Sample.AutoCreateIfPresent/OrderByHourRoute.cs +++ b/samples/Sample.AutoCreateIfPresent/OrderByHourRoute.cs @@ -1,184 +1,184 @@ -using System; -using System.Collections.Concurrent; -using System.Linq.Expressions; -using MySqlConnector; -using ShardingCore; -using ShardingCore.Core.EntityMetadatas; -using ShardingCore.Core.PhysicTables; -using ShardingCore.Core.ShardingConfigurations; -using ShardingCore.Core.ShardingConfigurations.Abstractions; -using ShardingCore.Core.VirtualDatabase.VirtualDataSources.Abstractions; -using ShardingCore.Core.VirtualDatabase.VirtualTables; -using ShardingCore.Core.VirtualRoutes; -using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions; -using ShardingCore.Exceptions; -using ShardingCore.Extensions; -using ShardingCore.TableCreator; -using ShardingCore.TableExists; - -/* -* @Author: xjm -* @Description: -* @Date: DATE -* @Email: 326308290@qq.com -*/ -namespace Sample.AutoCreateIfPresent -{ - public class OrderByHourRoute : AbstractShardingOperatorVirtualTableRoute - { - private const string Tables = "Tables"; - private const string TABLE_SCHEMA = "TABLE_SCHEMA"; - private const string TABLE_NAME = "TABLE_NAME"; - - private const string CurrentTableName = nameof(OrderByHour); - private readonly IVirtualDataSourceManager _virtualDataSourceManager; - private readonly IVirtualTableManager _virtualTableManager; - private readonly IShardingTableCreator _shardingTableCreator; - private readonly ConcurrentDictionary _tails = new ConcurrentDictionary(); - private readonly object _lock = new object(); - - public OrderByHourRoute(IVirtualDataSourceManager virtualDataSourceManager,IVirtualTableManager virtualTableManager, IShardingTableCreator shardingTableCreator) - { - _virtualDataSourceManager = virtualDataSourceManager; - _virtualTableManager = virtualTableManager; - _shardingTableCreator = shardingTableCreator; - } - - public override string ShardingKeyToTail(object shardingKey) - { - var dateTime = (DateTime)shardingKey; - return ShardingKeyFormat(dateTime); - } - private string ShardingKeyFormat(DateTime dateTime) - { - var tail = $"{dateTime:yyyyMMddHH}"; - - return tail; - } - - /// - /// 如果你是非mysql数据库请自行实现这个方法返回当前类在数据库已经存在的后缀 - /// 仅启动时调用 - /// - /// - public override List GetTails() - { - //启动寻找有哪些表后缀 - using (var connection = new MySqlConnection(_virtualDataSourceManager.GetCurrentVirtualDataSource().DefaultConnectionString)) - { - connection.Open(); - var database = connection.Database; - - using (var dataTable = connection.GetSchema(Tables)) - { - for (int i = 0; i < dataTable.Rows.Count; i++) - { - var schema = dataTable.Rows[i][TABLE_SCHEMA]; - if (database.Equals($"{schema}", StringComparison.OrdinalIgnoreCase)) - { - var tableName = dataTable.Rows[i][TABLE_NAME]?.ToString()??string.Empty; - if (tableName.StartsWith(CurrentTableName, StringComparison.OrdinalIgnoreCase)) - { - //如果没有下划线那么需要CurrentTableName.Length有下划线就要CurrentTableName.Length+1 - _tails.TryAdd(tableName.Substring(CurrentTableName.Length+1),null); - } - } - } - } - } - return _tails.Keys.ToList(); - } - - public override void Configure(EntityMetadataTableBuilder builder) - { - builder.ShardingProperty(o => o.CreateTime); - } - - public override Func GetRouteToFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator) - { - var t = ShardingKeyFormat(shardingKey); - switch (shardingOperator) - { - case ShardingOperatorEnum.GreaterThan: - case ShardingOperatorEnum.GreaterThanOrEqual: - return tail => String.Compare(tail, t, StringComparison.Ordinal) >= 0; - case ShardingOperatorEnum.LessThan: - { - var currentHourBeginTime = new DateTime(shardingKey.Year,shardingKey.Month,shardingKey.Day,shardingKey.Hour,0,0); - //处于临界值 o=>o.time < [2021-01-01 00:00:00] 尾巴20210101不应该被返回 - if (currentHourBeginTime == shardingKey) - return tail => String.Compare(tail, t, StringComparison.Ordinal) < 0; - return tail => String.Compare(tail, t, StringComparison.Ordinal) <= 0; - } - case ShardingOperatorEnum.LessThanOrEqual: - return tail => String.Compare(tail, t, StringComparison.Ordinal) <= 0; - case ShardingOperatorEnum.Equal: return tail => tail == t; - default: - { -#if DEBUG - Console.WriteLine($"shardingOperator is not equal scan all table tail"); -#endif - return tail => true; - } - } - } - - public override IPhysicTable RouteWithValue(List allPhysicTables, object shardingKey) - { - var shardingKeyToTail = ShardingKeyToTail(shardingKey); - - if (!_tails.TryGetValue(shardingKeyToTail,out var _)) - { - lock (_lock) - { - if (!_tails.TryGetValue(shardingKeyToTail,out var _)) - { - var virtualTable = _virtualTableManager.GetVirtualTable(typeof(OrderByHour)); -//必须先执行AddPhysicTable在进行CreateTable - _virtualTableManager.AddPhysicTable(virtualTable, new DefaultPhysicTable(virtualTable, shardingKeyToTail)); - try - { - _shardingTableCreator.CreateTable(_virtualDataSourceManager.GetCurrentVirtualDataSource().DefaultDataSourceName, shardingKeyToTail); - } - catch (Exception ex) - { - Console.WriteLine("尝试添加表失败" + ex); - } - - _tails.TryAdd(shardingKeyToTail,null); - } - } - } - - var needRefresh = allPhysicTables.Count != _tails.Count; - if (needRefresh) - { - var virtualTable = _virtualTableManager.GetVirtualTable(typeof(OrderByHour)); - //修复可能导致迭代器遍历时添加的bug - var keys = _tails.Keys.ToList(); - foreach (var tail in keys) - { - var hashSet = allPhysicTables.Select(o=>o.Tail).ToHashSet(); - if (!hashSet.Contains(tail)) - { - var tables = virtualTable.GetAllPhysicTables(); - var physicTable = tables.FirstOrDefault(o=>o.Tail==tail); - if (physicTable!= null) - { - allPhysicTables.Add(physicTable); - } - } - } - } - var physicTables = allPhysicTables.Where(o => o.Tail== shardingKeyToTail).ToList(); - if (physicTables.IsEmpty()) - { - throw new ShardingCoreException($"sharding key route not match {EntityMetadata.EntityType} -> [{EntityMetadata.ShardingTableProperty.Name}] ->【{shardingKey}】 all tails ->[{string.Join(",", allPhysicTables.Select(o=>o.FullName))}]"); - } - - if (physicTables.Count > 1) - throw new ShardingCoreException($"more than one route match table:{string.Join(",", physicTables.Select(o => $"[{o.FullName}]"))}"); - return physicTables[0]; - } - } -} \ No newline at end of file +// using System; +// using System.Collections.Concurrent; +// using System.Linq.Expressions; +// using MySqlConnector; +// using ShardingCore; +// using ShardingCore.Core.EntityMetadatas; +// using ShardingCore.Core.PhysicTables; +// using ShardingCore.Core.ShardingConfigurations; +// using ShardingCore.Core.ShardingConfigurations.Abstractions; +// using ShardingCore.Core.VirtualDatabase.VirtualDataSources.Abstractions; +// using ShardingCore.Core.VirtualDatabase.VirtualTables; +// using ShardingCore.Core.VirtualRoutes; +// using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions; +// using ShardingCore.Exceptions; +// using ShardingCore.Extensions; +// using ShardingCore.TableCreator; +// using ShardingCore.TableExists; +// +// /* +// * @Author: xjm +// * @Description: +// * @Date: DATE +// * @Email: 326308290@qq.com +// */ +// namespace Sample.AutoCreateIfPresent +// { +// public class OrderByHourRoute : AbstractShardingOperatorVirtualTableRoute +// { +// private const string Tables = "Tables"; +// private const string TABLE_SCHEMA = "TABLE_SCHEMA"; +// private const string TABLE_NAME = "TABLE_NAME"; +// +// private const string CurrentTableName = nameof(OrderByHour); +// private readonly IVirtualDataSourceManager _virtualDataSourceManager; +// private readonly IVirtualTableManager _virtualTableManager; +// private readonly IShardingTableCreator _shardingTableCreator; +// private readonly ConcurrentDictionary _tails = new ConcurrentDictionary(); +// private readonly object _lock = new object(); +// +// public OrderByHourRoute(IVirtualDataSourceManager virtualDataSourceManager,IVirtualTableManager virtualTableManager, IShardingTableCreator shardingTableCreator) +// { +// _virtualDataSourceManager = virtualDataSourceManager; +// _virtualTableManager = virtualTableManager; +// _shardingTableCreator = shardingTableCreator; +// } +// +// public override string ShardingKeyToTail(object shardingKey) +// { +// var dateTime = (DateTime)shardingKey; +// return ShardingKeyFormat(dateTime); +// } +// private string ShardingKeyFormat(DateTime dateTime) +// { +// var tail = $"{dateTime:yyyyMMddHH}"; +// +// return tail; +// } +// +// /// +// /// 如果你是非mysql数据库请自行实现这个方法返回当前类在数据库已经存在的后缀 +// /// 仅启动时调用 +// /// +// /// +// public override List GetTails() +// { +// //启动寻找有哪些表后缀 +// using (var connection = new MySqlConnection(_virtualDataSourceManager.GetCurrentVirtualDataSource().DefaultConnectionString)) +// { +// connection.Open(); +// var database = connection.Database; +// +// using (var dataTable = connection.GetSchema(Tables)) +// { +// for (int i = 0; i < dataTable.Rows.Count; i++) +// { +// var schema = dataTable.Rows[i][TABLE_SCHEMA]; +// if (database.Equals($"{schema}", StringComparison.OrdinalIgnoreCase)) +// { +// var tableName = dataTable.Rows[i][TABLE_NAME]?.ToString()??string.Empty; +// if (tableName.StartsWith(CurrentTableName, StringComparison.OrdinalIgnoreCase)) +// { +// //如果没有下划线那么需要CurrentTableName.Length有下划线就要CurrentTableName.Length+1 +// _tails.TryAdd(tableName.Substring(CurrentTableName.Length+1),null); +// } +// } +// } +// } +// } +// return _tails.Keys.ToList(); +// } +// +// public override void Configure(EntityMetadataTableBuilder builder) +// { +// builder.ShardingProperty(o => o.CreateTime); +// } +// +// public override Func GetRouteToFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator) +// { +// var t = ShardingKeyFormat(shardingKey); +// switch (shardingOperator) +// { +// case ShardingOperatorEnum.GreaterThan: +// case ShardingOperatorEnum.GreaterThanOrEqual: +// return tail => String.Compare(tail, t, StringComparison.Ordinal) >= 0; +// case ShardingOperatorEnum.LessThan: +// { +// var currentHourBeginTime = new DateTime(shardingKey.Year,shardingKey.Month,shardingKey.Day,shardingKey.Hour,0,0); +// //处于临界值 o=>o.time < [2021-01-01 00:00:00] 尾巴20210101不应该被返回 +// if (currentHourBeginTime == shardingKey) +// return tail => String.Compare(tail, t, StringComparison.Ordinal) < 0; +// return tail => String.Compare(tail, t, StringComparison.Ordinal) <= 0; +// } +// case ShardingOperatorEnum.LessThanOrEqual: +// return tail => String.Compare(tail, t, StringComparison.Ordinal) <= 0; +// case ShardingOperatorEnum.Equal: return tail => tail == t; +// default: +// { +// #if DEBUG +// Console.WriteLine($"shardingOperator is not equal scan all table tail"); +// #endif +// return tail => true; +// } +// } +// } +// +// public override IPhysicTable RouteWithValue(List allPhysicTables, object shardingKey) +// { +// var shardingKeyToTail = ShardingKeyToTail(shardingKey); +// +// if (!_tails.TryGetValue(shardingKeyToTail,out var _)) +// { +// lock (_lock) +// { +// if (!_tails.TryGetValue(shardingKeyToTail,out var _)) +// { +// var virtualTable = _virtualTableManager.GetVirtualTable(typeof(OrderByHour)); +// //必须先执行AddPhysicTable在进行CreateTable +// _virtualTableManager.AddPhysicTable(virtualTable, new DefaultPhysicTable(virtualTable, shardingKeyToTail)); +// try +// { +// _shardingTableCreator.CreateTable(_virtualDataSourceManager.GetCurrentVirtualDataSource().DefaultDataSourceName, shardingKeyToTail); +// } +// catch (Exception ex) +// { +// Console.WriteLine("尝试添加表失败" + ex); +// } +// +// _tails.TryAdd(shardingKeyToTail,null); +// } +// } +// } +// +// var needRefresh = allPhysicTables.Count != _tails.Count; +// if (needRefresh) +// { +// var virtualTable = _virtualTableManager.GetVirtualTable(typeof(OrderByHour)); +// //修复可能导致迭代器遍历时添加的bug +// var keys = _tails.Keys.ToList(); +// foreach (var tail in keys) +// { +// var hashSet = allPhysicTables.Select(o=>o.Tail).ToHashSet(); +// if (!hashSet.Contains(tail)) +// { +// var tables = virtualTable.GetAllPhysicTables(); +// var physicTable = tables.FirstOrDefault(o=>o.Tail==tail); +// if (physicTable!= null) +// { +// allPhysicTables.Add(physicTable); +// } +// } +// } +// } +// var physicTables = allPhysicTables.Where(o => o.Tail== shardingKeyToTail).ToList(); +// if (physicTables.IsEmpty()) +// { +// throw new ShardingCoreException($"sharding key route not match {EntityMetadata.EntityType} -> [{EntityMetadata.ShardingTableProperty.Name}] ->【{shardingKey}】 all tails ->[{string.Join(",", allPhysicTables.Select(o=>o.FullName))}]"); +// } +// +// if (physicTables.Count > 1) +// throw new ShardingCoreException($"more than one route match table:{string.Join(",", physicTables.Select(o => $"[{o.FullName}]"))}"); +// return physicTables[0]; +// } +// } +// } \ No newline at end of file diff --git a/samples/Sample.AutoCreateIfPresent/Program.cs b/samples/Sample.AutoCreateIfPresent/Program.cs index e6e3c6e6..e2e6634a 100644 --- a/samples/Sample.AutoCreateIfPresent/Program.cs +++ b/samples/Sample.AutoCreateIfPresent/Program.cs @@ -22,8 +22,8 @@ builder.Services.AddShardingDbContext() .AddEntityConfig(o => { o.ThrowIfQueryRouteNotMatch = false; - o.AddShardingTableRoute(); - o.AddShardingTableRoute(); + // o.AddShardingTableRoute(); + // o.AddShardingTableRoute(); }) .AddConfig(o => {