Skip to content

Commit 09bb6c2

Browse files
committed
修复启动分表bug,优化动态追加数据源表
1 parent 1d3f36b commit 09bb6c2

File tree

12 files changed

+300
-336
lines changed

12 files changed

+300
-336
lines changed

nuget-publish.bat

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
:start
22
::定义版本
3-
set EFCORE2=2.3.1.77
4-
set EFCORE3=3.3.1.77
5-
set EFCORE5=5.3.1.77
6-
set EFCORE6=6.3.1.77
3+
set EFCORE2=2.3.1.78
4+
set EFCORE3=3.3.1.78
5+
set EFCORE5=5.3.1.78
6+
set EFCORE6=6.3.1.78
77

88
::删除所有bin与obj下的文件
99
@echo off

samples/Sample.SqlServerShardingAll/DbContextHelper.cs

Lines changed: 0 additions & 152 deletions
This file was deleted.

src/ShardingCore/Bootstrapers/ShardingDbContextBootstrapper.cs

Lines changed: 6 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
using ShardingCore.Core.VirtualRoutes.TableRoutes;
2020
using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions;
2121
using ShardingCore.Core.VirtualTables;
22+
using ShardingCore.DynamicDataSources;
2223
using ShardingCore.Exceptions;
2324
using ShardingCore.Extensions;
2425
using ShardingCore.Jobs;
@@ -60,6 +61,7 @@ public class ShardingDbContextBootstrapper<TShardingDbContext> : IShardingDbCont
6061
private readonly IEntityMetadataManager<TShardingDbContext> _entityMetadataManager;
6162
private readonly IShardingTableCreator<TShardingDbContext> _tableCreator;
6263
private readonly IParallelTableManager<TShardingDbContext> _parallelTableManager;
64+
private readonly IDefaultDataSourceInitializer<TShardingDbContext> _dataSourceInitializer;
6365
private readonly ILogger<ShardingDbContextBootstrapper<TShardingDbContext>> _logger;
6466

6567
public ShardingDbContextBootstrapper(IShardingConfigOption shardingConfigOption)
@@ -71,6 +73,7 @@ public ShardingDbContextBootstrapper(IShardingConfigOption shardingConfigOption)
7173
_tableCreator = ShardingContainer.GetService<IShardingTableCreator<TShardingDbContext>>();
7274
_virtualDataSource= ShardingContainer.GetService<IVirtualDataSource<TShardingDbContext>>();
7375
_parallelTableManager = ShardingContainer.GetService<IParallelTableManager<TShardingDbContext>>();
76+
_dataSourceInitializer = ShardingContainer.GetService<IDefaultDataSourceInitializer<TShardingDbContext>>();
7477
_logger = ShardingContainer.GetService<ILogger<ShardingDbContextBootstrapper<TShardingDbContext>>>();
7578
}
7679
/// <summary>
@@ -143,130 +146,10 @@ private void InitializeConfigure()
143146
var dataSources = _shardingConfigOption.GetDataSources();
144147
foreach (var dataSourceKv in dataSources)
145148
{
146-
using (var serviceScope = ShardingContainer.ServiceProvider.CreateScope())
147-
{
148-
var dataSourceName = dataSourceKv.Key;
149-
var connectionString = dataSourceKv.Value;
150-
_virtualDataSource.AddPhysicDataSource(new DefaultPhysicDataSource(dataSourceName, connectionString, false));
151-
using var context =
152-
(DbContext)serviceScope.ServiceProvider.GetService(_shardingConfigOption.ShardingDbContextType);
153-
if (_shardingConfigOption.EnsureCreatedWithOutShardingTable)
154-
EnsureCreated(context, dataSourceName);
155-
foreach (var entity in context.Model.GetEntityTypes())
156-
{
157-
var entityType = entity.ClrType;
158-
159-
if (_entityMetadataManager.IsShardingTable(entityType))
160-
{
161-
var virtualTable = _virtualTableManager.GetVirtualTable(entityType);
162-
//创建表
163-
CreateDataTable(dataSourceName, virtualTable);
164-
}
165-
else
166-
{
167-
if(_shardingConfigOption.NeedCreateTable(entityType))
168-
{
169-
_tableCreator.CreateTable(dataSourceName, entityType, string.Empty);
170-
}
171-
}
172-
}
173-
}
149+
var dataSourceName = dataSourceKv.Key;
150+
var connectionString = dataSourceKv.Value;
151+
_dataSourceInitializer.InitConfigure(dataSourceName, connectionString);
174152
}
175153
}
176-
private void CreateDataTable(string dataSourceName, IVirtualTable virtualTable)
177-
{
178-
var entityMetadata = virtualTable.EntityMetadata;
179-
foreach (var tail in virtualTable.GetVirtualRoute().GetAllTails())
180-
{
181-
if (NeedCreateTable(entityMetadata))
182-
{
183-
try
184-
{
185-
186-
//添加物理表
187-
virtualTable.AddPhysicTable(new DefaultPhysicTable(virtualTable, tail));
188-
_tableCreator.CreateTable(dataSourceName, entityMetadata.EntityType, tail);
189-
}
190-
catch (Exception e)
191-
{
192-
if (!_shardingConfigOption.IgnoreCreateTableError.GetValueOrDefault())
193-
{
194-
_logger.LogWarning(e,
195-
$"table :{virtualTable.GetVirtualTableName()}{entityMetadata.TableSeparator}{tail} will created.");
196-
}
197-
}
198-
}
199-
else
200-
{
201-
//添加物理表
202-
virtualTable.AddPhysicTable(new DefaultPhysicTable(virtualTable, tail));
203-
}
204-
205-
}
206-
}
207-
private bool NeedCreateTable(EntityMetadata entityMetadata)
208-
{
209-
if (entityMetadata.AutoCreateTable.HasValue)
210-
{
211-
if (entityMetadata.AutoCreateTable.Value)
212-
return entityMetadata.AutoCreateTable.Value;
213-
else
214-
{
215-
if (entityMetadata.AutoCreateDataSourceTable.HasValue)
216-
return entityMetadata.AutoCreateDataSourceTable.Value;
217-
}
218-
}
219-
if (entityMetadata.AutoCreateDataSourceTable.HasValue)
220-
{
221-
if (entityMetadata.AutoCreateDataSourceTable.Value)
222-
return entityMetadata.AutoCreateDataSourceTable.Value;
223-
else
224-
{
225-
if (entityMetadata.AutoCreateTable.HasValue)
226-
return entityMetadata.AutoCreateTable.Value;
227-
}
228-
}
229-
230-
return _shardingConfigOption.CreateShardingTableOnStart.GetValueOrDefault();
231-
}
232-
private void EnsureCreated(DbContext context, string dataSourceName)
233-
{
234-
if (context is IShardingDbContext shardingDbContext)
235-
{
236-
var dbContext = shardingDbContext.GetDbContext(dataSourceName, false, _routeTailFactory.Create(string.Empty));
237-
238-
var isDefault = _virtualDataSource.IsDefault(dataSourceName);
239-
240-
var modelCacheSyncObject = dbContext.GetModelCacheSyncObject();
241-
242-
var acquire = Monitor.TryEnter(modelCacheSyncObject, TimeSpan.FromSeconds(3));
243-
if (!acquire)
244-
{
245-
throw new ShardingCoreException("cant get modelCacheSyncObject lock");
246-
}
247-
248-
try
249-
{
250-
if(isDefault)
251-
{
252-
dbContext.RemoveDbContextRelationModelThatIsShardingTable();
253-
}
254-
else
255-
{
256-
dbContext.RemoveDbContextAllRelationModelThatIsNoSharding();
257-
}
258-
dbContext.Database.EnsureCreated();
259-
dbContext.RemoveModelCache();
260-
}
261-
finally
262-
{
263-
Monitor.Exit(modelCacheSyncObject);
264-
}
265-
}
266-
}
267-
268-
269-
270-
271154
}
272155
}

src/ShardingCore/DIExtension.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@
2929
using ShardingCore.Sharding.ShardingQueryExecutors;
3030
using ShardingCore.TableCreator;
3131
using System;
32+
using ShardingCore.DynamicDataSources;
3233
using ShardingCore.Sharding.ParallelTables;
34+
using ShardingCore.Sharding.ReadWriteConfigurations;
35+
using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions;
3336

3437
namespace ShardingCore
3538
{
@@ -86,6 +89,7 @@ internal static IServiceCollection AddInternalShardingCore(this IServiceCollecti
8689
services.TryAddSingleton(typeof(IShardingDbContextCreatorConfig<>),typeof(DefaultShardingDbContextCreatorConfig<>));
8790

8891

92+
services.TryAddSingleton(typeof(IDefaultDataSourceInitializer<>),typeof(DefaultDataSourceInitializer<>));
8993
services.TryAddSingleton(typeof(ITrackerManager<>),typeof(TrackerManager<>));
9094
services.TryAddSingleton(typeof(IStreamMergeContextFactory<>),typeof(StreamMergeContextFactory<>));
9195
services.TryAddSingleton(typeof(IShardingTableCreator<>),typeof(ShardingTableCreator<>));
@@ -109,6 +113,7 @@ internal static IServiceCollection AddInternalShardingCore(this IServiceCollecti
109113
services.TryAddSingleton(typeof(IParallelTableManager<>),typeof(ParallelTableManager<>));
110114
services.TryAddSingleton<IRouteTailFactory, RouteTailFactory>();
111115
services.TryAddSingleton<IShardingQueryExecutor, DefaultShardingQueryExecutor>();
116+
services.TryAddSingleton<IReadWriteConnectorFactory, ReadWriteConnectorFactory>();
112117

113118
//route manage
114119
services.TryAddSingleton<IShardingRouteManager, ShardingRouteManager>();

src/ShardingCore/DIExtensions/ShardingCoreConfigEndBuilder.cs

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -98,29 +98,14 @@ private void RegisterReadWriteConfigure(IServiceCollection services)
9898
_shardingCoreConfigBuilder.ShardingConfigOption.ReadWriteDefaultEnable,
9999
_shardingCoreConfigBuilder.ShardingConfigOption.ReadStrategyEnum,
100100
_shardingCoreConfigBuilder.ShardingConfigOption.ReadConnStringGetStrategy));
101-
bool isLoop = false;
102-
var readStrategyEnum = _shardingCoreConfigBuilder.ShardingConfigOption.ReadStrategyEnum;
103-
104-
if ( readStrategyEnum== ReadStrategyEnum.Loop)
105-
{
106-
isLoop = true;
107-
}
108-
else if (_shardingCoreConfigBuilder.ShardingConfigOption.ReadStrategyEnum == ReadStrategyEnum.Random)
109-
{
110-
isLoop = false;
111-
}
112-
else
113-
{
114-
throw new ShardingCoreInvalidOperationException($"unknow ReadStrategyEnum confgure:{_shardingCoreConfigBuilder.ShardingConfigOption.ReadStrategyEnum}");
115-
}
116101

117102
services
118103
.AddSingleton<IShardingConnectionStringResolver<TShardingDbContext>,
119104
ReadWriteShardingConnectionStringResolver<TShardingDbContext>>(sp =>
120105
{
121-
122-
var readConnString = _shardingCoreConfigBuilder.ShardingConfigOption.ReadConnStringConfigure(sp);
123-
var readWriteLoopConnectors = readConnString.Select(o => (IReadWriteConnector)(isLoop ? new ReadWriteLoopConnector(o.Key, o.Value) : new ReadWriteRandomConnector(o.Key, o.Value)));
106+
var readWriteConnectorFactory = sp.GetRequiredService<IReadWriteConnectorFactory>();
107+
var readConnStrings = _shardingCoreConfigBuilder.ShardingConfigOption.ReadConnStringConfigure(sp);
108+
var readWriteLoopConnectors = readConnStrings.Select(o => readWriteConnectorFactory.CreateConnector<TShardingDbContext>(_shardingCoreConfigBuilder.ShardingConfigOption.ReadStrategyEnum,o.Key,o.Value));
124109

125110
return new ReadWriteShardingConnectionStringResolver<TShardingDbContext>(
126111
readWriteLoopConnectors);

0 commit comments

Comments
 (0)