修复启动创建导致的部分dbcontext没有回收的bug

This commit is contained in:
xuejiaming 2022-06-22 08:14:01 +08:00
parent aecc1239a3
commit f5feb8db1e
2 changed files with 53 additions and 63 deletions

View File

@ -54,42 +54,44 @@ namespace ShardingCore.DynamicDataSources
{
using (_virtualDataSourceManager.CreateScope(virtualDataSource.ConfigId))
{
using var context = serviceScope.ServiceProvider.GetService<TShardingDbContext>();
if (_entityConfigOptions.EnsureCreatedWithOutShardingTable || !isOnStart)
EnsureCreated(virtualDataSource, context, dataSourceName);
else if (_entityConfigOptions.CreateDataBaseOnlyOnStart.GetValueOrDefault())
using (var context = serviceScope.ServiceProvider.GetService<TShardingDbContext>())
{
EnsureCreateDataBaseOnly(context, dataSourceName);
}
var tableEnsureManager = virtualDataSource.ConfigurationParams.TableEnsureManager;
////获取数据库存在的所有的表
var existTables = tableEnsureManager?.GetExistTables(context, dataSourceName) ??
new HashSet<string>();
foreach (var entity in context.Model.GetEntityTypes())
{
var entityType = entity.ClrType;
if (virtualDataSource.IsDefault(dataSourceName))
if (_entityConfigOptions.EnsureCreatedWithOutShardingTable || !isOnStart)
EnsureCreated(virtualDataSource, context, dataSourceName);
else if (_entityConfigOptions.CreateDataBaseOnlyOnStart.GetValueOrDefault())
{
if (_entityMetadataManager.IsShardingTable(entityType))
{
var virtualTable = _virtualTableManager.GetVirtualTable(entityType);
//创建表
CreateDataTable(dataSourceName, virtualTable, existTables, isOnStart);
}
EnsureCreateDataBaseOnly(context, dataSourceName);
}
else
var tableEnsureManager = virtualDataSource.ConfigurationParams.TableEnsureManager;
////获取数据库存在的所有的表
var existTables = tableEnsureManager?.GetExistTables(context, dataSourceName) ??
new HashSet<string>();
foreach (var entity in context.Model.GetEntityTypes())
{
if (_entityMetadataManager.IsShardingDataSource(entityType))
var entityType = entity.ClrType;
if (virtualDataSource.IsDefault(dataSourceName))
{
var virtualDataSourceRoute = virtualDataSource.GetRoute(entityType);
if (virtualDataSourceRoute.GetAllDataSourceNames().Contains(dataSourceName))
if (_entityMetadataManager.IsShardingTable(entityType))
{
if (_entityMetadataManager.IsShardingTable(entityType))
var virtualTable = _virtualTableManager.GetVirtualTable(entityType);
//创建表
CreateDataTable(dataSourceName, virtualTable, existTables, isOnStart);
}
}
else
{
if (_entityMetadataManager.IsShardingDataSource(entityType))
{
var virtualDataSourceRoute = virtualDataSource.GetRoute(entityType);
if (virtualDataSourceRoute.GetAllDataSourceNames().Contains(dataSourceName))
{
var virtualTable = _virtualTableManager.GetVirtualTable(entityType);
//创建表
CreateDataTable(dataSourceName, virtualTable, existTables, isOnStart);
if (_entityMetadataManager.IsShardingTable(entityType))
{
var virtualTable = _virtualTableManager.GetVirtualTable(entityType);
//创建表
CreateDataTable(dataSourceName, virtualTable, existTables, isOnStart);
}
}
}
}
@ -164,21 +166,12 @@ namespace ShardingCore.DynamicDataSources
{
if (context is IShardingDbContext shardingDbContext)
{
var dbContext =
shardingDbContext.GetDbContext(dataSourceName, false, _routeTailFactory.Create(string.Empty));
var isDefault = virtualDataSource.IsDefault(dataSourceName);
var modelCacheSyncObject = dbContext.GetModelCacheSyncObject();
var acquire = Monitor.TryEnter(modelCacheSyncObject, TimeSpan.FromSeconds(3));
if (!acquire)
using (var dbContext =
shardingDbContext.GetDbContext(dataSourceName, false,
_routeTailFactory.Create(string.Empty, false)))
{
throw new ShardingCoreException("cant get modelCacheSyncObject lock");
}
var isDefault = virtualDataSource.IsDefault(dataSourceName);
try
{
if (isDefault)
{
dbContext.RemoveDbContextRelationModelThatIsShardingTable();
@ -189,11 +182,6 @@ namespace ShardingCore.DynamicDataSources
}
dbContext.Database.EnsureCreated();
dbContext.RemoveModelCache();
}
finally
{
Monitor.Exit(modelCacheSyncObject);
}
}
}
@ -208,7 +196,6 @@ namespace ShardingCore.DynamicDataSources
dbContext.RemoveDbContextAllRelationModel();
dbContext.Database.EnsureCreated();
}
}
}
}

View File

@ -50,24 +50,27 @@ namespace ShardingCore.TableCreator
{
using (var serviceScope = _serviceProvider.CreateScope())
{
var dbContext = serviceScope.ServiceProvider.GetService<TShardingDbContext>();
var shardingDbContext = (IShardingDbContext)dbContext;
using (var context = shardingDbContext.GetDbContext(dataSourceName, false,
_routeTailFactory.Create(tail, false)))
using (var dbContext = serviceScope.ServiceProvider.GetService<TShardingDbContext>())
{
context.RemoveDbContextRelationModelSaveOnlyThatIsNamedType(shardingEntityType);
var databaseCreator = context.Database.GetService<IDatabaseCreator>() as RelationalDatabaseCreator;
try
var shardingDbContext = (IShardingDbContext)dbContext;
using (var context = shardingDbContext.GetDbContext(dataSourceName, false,
_routeTailFactory.Create(tail, false)))
{
databaseCreator.CreateTables();
}
catch (Exception ex)
{
if (!_entityConfigOptions.IgnoreCreateTableError.GetValueOrDefault())
context.RemoveDbContextRelationModelSaveOnlyThatIsNamedType(shardingEntityType);
var databaseCreator = context.Database.GetService<IDatabaseCreator>() as RelationalDatabaseCreator;
try
{
_logger.LogWarning(ex,
$"create table error entity name:[{shardingEntityType.Name}].");
throw new ShardingCoreException($" create table error :{ex.Message}", ex);
databaseCreator.CreateTables();
}
catch (Exception ex)
{
if (!_entityConfigOptions.IgnoreCreateTableError.GetValueOrDefault())
{
_logger.LogWarning(ex,
$"create table error entity name:[{shardingEntityType.Name}].");
throw new ShardingCoreException($" create table error :{ex.Message}", ex);
}
}
}
}