Merge branch 'main' of github.com:dotnetcore/sharding-core
This commit is contained in:
commit
0f06a7a2b2
|
@ -65,7 +65,6 @@ namespace Sample.MySql.Controllers
|
||||||
// //一定要先在路由里面添加尾巴
|
// //一定要先在路由里面添加尾巴
|
||||||
// virtualTableRoute.Append("20220921");
|
// virtualTableRoute.Append("20220921");
|
||||||
// shardingTableCreator.CreateTable<SysUserMod>("ds0","20220921");
|
// shardingTableCreator.CreateTable<SysUserMod>("ds0","20220921");
|
||||||
|
|
||||||
return _defaultTableDbContext.Set<SysTest>();
|
return _defaultTableDbContext.Set<SysTest>();
|
||||||
}
|
}
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
|
|
|
@ -179,7 +179,6 @@ namespace Sample.MySql
|
||||||
{
|
{
|
||||||
app.UseDeveloperExceptionPage();
|
app.UseDeveloperExceptionPage();
|
||||||
}
|
}
|
||||||
app.ApplicationServices.UseAutoShardingCreate();
|
|
||||||
// app.ApplicationServices.UseAutoTryCompensateTable();
|
// app.ApplicationServices.UseAutoTryCompensateTable();
|
||||||
|
|
||||||
// app.ApplicationServices.UseAutoShardingCreate();
|
// app.ApplicationServices.UseAutoShardingCreate();
|
||||||
|
|
|
@ -5,7 +5,6 @@ using Sample.ShardingConsole;
|
||||||
using ShardingCore;
|
using ShardingCore;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
|
|
||||||
ShardingProvider.ShardingRuntimeContext.UseAutoShardingCreate();
|
|
||||||
ShardingProvider.ShardingRuntimeContext.UseAutoTryCompensateTable();
|
ShardingProvider.ShardingRuntimeContext.UseAutoTryCompensateTable();
|
||||||
|
|
||||||
var dbContextOptionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
|
var dbContextOptionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
|
||||||
|
|
|
@ -10,7 +10,7 @@ namespace ShardingCore.Bootstrappers
|
||||||
/// 主要的分片初始化器,需要手动调用,如果你的分片路由存在定时执行的job譬如
|
/// 主要的分片初始化器,需要手动调用,如果你的分片路由存在定时执行的job譬如
|
||||||
/// 系统默认的时间分片的情况下那么需要调用<code>IShardingRuntimeContext初始化的时候会调用</code>
|
/// 系统默认的时间分片的情况下那么需要调用<code>IShardingRuntimeContext初始化的时候会调用</code>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IShardingBootstrapper
|
internal interface IShardingBootstrapper
|
||||||
{
|
{
|
||||||
void AutoShardingCreate();
|
void AutoShardingCreate();
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,21 +25,18 @@ namespace ShardingCore.Bootstrappers
|
||||||
* @Date: Monday, 21 December 2020 09:10:07
|
* @Date: Monday, 21 December 2020 09:10:07
|
||||||
* @Email: 326308290@qq.com
|
* @Email: 326308290@qq.com
|
||||||
*/
|
*/
|
||||||
public class ShardingBootstrapper : IShardingBootstrapper
|
internal class ShardingBootstrapper : IShardingBootstrapper
|
||||||
{
|
{
|
||||||
private readonly IShardingProvider _shardingProvider;
|
private readonly IShardingProvider _shardingProvider;
|
||||||
private readonly IDbContextCreator _dbContextCreator;
|
|
||||||
private readonly DoOnlyOnce _onlyOnce=new DoOnlyOnce();
|
private readonly DoOnlyOnce _onlyOnce=new DoOnlyOnce();
|
||||||
public ShardingBootstrapper(IShardingProvider shardingProvider,IDbContextCreator dbContextCreator)
|
public ShardingBootstrapper(IShardingProvider shardingProvider)
|
||||||
{
|
{
|
||||||
_shardingProvider = shardingProvider;
|
_shardingProvider = shardingProvider;
|
||||||
_dbContextCreator = dbContextCreator;
|
|
||||||
}
|
}
|
||||||
public void AutoShardingCreate()
|
public void AutoShardingCreate()
|
||||||
{
|
{
|
||||||
if (!_onlyOnce.IsUnDo())
|
if (!_onlyOnce.IsUnDo())
|
||||||
return;
|
return;
|
||||||
CheckRequirement();
|
|
||||||
StartAutoShardingJob();
|
StartAutoShardingJob();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,29 +48,6 @@ namespace ShardingCore.Bootstrappers
|
||||||
await jobRunnerService.StartAsync();
|
await jobRunnerService.StartAsync();
|
||||||
}, TaskCreationOptions.LongRunning);
|
}, TaskCreationOptions.LongRunning);
|
||||||
}
|
}
|
||||||
private void CheckRequirement()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
using (var scope = _shardingProvider.CreateScope())
|
|
||||||
{
|
|
||||||
using (var dbContext = _dbContextCreator.GetShellDbContext(scope.ServiceProvider))
|
|
||||||
{
|
|
||||||
if (dbContext == null)
|
|
||||||
{
|
|
||||||
throw new ShardingCoreInvalidOperationException(
|
|
||||||
$"cant get shell db context,plz override {nameof(IDbContextCreator)}.{nameof(IDbContextCreator.GetShellDbContext)}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
throw new ShardingCoreInvalidOperationException(
|
|
||||||
$"cant get shell db context,plz override {nameof(IDbContextCreator)}.{nameof(IDbContextCreator.GetShellDbContext)}",
|
|
||||||
ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -5,6 +5,7 @@ using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using ShardingCore.Core.ServiceProviders;
|
using ShardingCore.Core.ServiceProviders;
|
||||||
|
using ShardingCore.Exceptions;
|
||||||
using ShardingCore.Helpers;
|
using ShardingCore.Helpers;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
|
|
||||||
|
@ -46,7 +47,16 @@ namespace ShardingCore.Core.DbContextCreator
|
||||||
|
|
||||||
public virtual DbContext GetShellDbContext(IShardingProvider shardingProvider)
|
public virtual DbContext GetShellDbContext(IShardingProvider shardingProvider)
|
||||||
{
|
{
|
||||||
return shardingProvider.GetService<TShardingDbContext>();
|
try
|
||||||
|
{
|
||||||
|
return shardingProvider.GetService<TShardingDbContext>();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new ShardingCoreInvalidOperationException(
|
||||||
|
$"cant get shell db context,plz override {nameof(IDbContextCreator)}.{nameof(IDbContextCreator.GetShellDbContext)}",
|
||||||
|
ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,11 +56,8 @@ namespace ShardingCore.Core.RuntimeContexts
|
||||||
IShardingPageManager GetShardingPageManager();
|
IShardingPageManager GetShardingPageManager();
|
||||||
IDataSourceInitializer GetDataSourceInitializer();
|
IDataSourceInitializer GetDataSourceInitializer();
|
||||||
|
|
||||||
void CheckRequirement();
|
|
||||||
|
|
||||||
void GetOrCreateShardingRuntimeModel(DbContext dbContext);
|
void GetOrCreateShardingRuntimeModel(DbContext dbContext);
|
||||||
void Initialize();
|
void Initialize();
|
||||||
void AutoShardingCreate();
|
|
||||||
object GetService(Type serviceType);
|
object GetService(Type serviceType);
|
||||||
TService GetService<TService>();
|
TService GetService<TService>();
|
||||||
object GetRequiredService(Type serviceType);
|
object GetRequiredService(Type serviceType);
|
||||||
|
|
|
@ -23,6 +23,7 @@ using ShardingCore.DynamicDataSources;
|
||||||
using ShardingCore.Exceptions;
|
using ShardingCore.Exceptions;
|
||||||
|
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
|
using ShardingCore.Sharding.MergeEngines.ParallelControl;
|
||||||
using ShardingCore.Sharding.ParallelTables;
|
using ShardingCore.Sharding.ParallelTables;
|
||||||
using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions;
|
using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions;
|
||||||
using ShardingCore.Sharding.ShardingComparision.Abstractions;
|
using ShardingCore.Sharding.ShardingComparision.Abstractions;
|
||||||
|
@ -67,10 +68,11 @@ namespace ShardingCore.Core.RuntimeContexts
|
||||||
_serviceProvider = _serviceMap.BuildServiceProvider();
|
_serviceProvider = _serviceMap.BuildServiceProvider();
|
||||||
_serviceProvider.GetRequiredService<IShardingInitializer>().Initialize();
|
_serviceProvider.GetRequiredService<IShardingInitializer>().Initialize();
|
||||||
InitFieldValue();
|
InitFieldValue();
|
||||||
|
AutoShardingCreate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AutoShardingCreate()
|
private void AutoShardingCreate()
|
||||||
{
|
{
|
||||||
GetRequiredService<IShardingBootstrapper>().AutoShardingCreate();
|
GetRequiredService<IShardingBootstrapper>().AutoShardingCreate();
|
||||||
}
|
}
|
||||||
|
@ -217,40 +219,6 @@ namespace ShardingCore.Core.RuntimeContexts
|
||||||
return _dataSourceInitializer??=GetRequiredService<IDataSourceInitializer>();
|
return _dataSourceInitializer??=GetRequiredService<IDataSourceInitializer>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CheckRequirement()
|
|
||||||
{
|
|
||||||
if (isCheckRequirement)
|
|
||||||
return;
|
|
||||||
|
|
||||||
lock (CHECK_REQUIREMENT)
|
|
||||||
{
|
|
||||||
if (isCheckRequirement)
|
|
||||||
return;
|
|
||||||
isCheckRequirement = true;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var shardingProvider = GetShardingProvider();
|
|
||||||
using (var scope = shardingProvider.CreateScope())
|
|
||||||
{
|
|
||||||
using (var dbContext = _dbContextCreator.GetShellDbContext(scope.ServiceProvider))
|
|
||||||
{
|
|
||||||
if (dbContext == null)
|
|
||||||
{
|
|
||||||
throw new ShardingCoreInvalidOperationException(
|
|
||||||
$"cant get shell db context,plz override {nameof(IDbContextCreator)}.{nameof(IDbContextCreator.GetShellDbContext)}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
throw new ShardingCoreInvalidOperationException(
|
|
||||||
$"cant get shell db context,plz override {nameof(IDbContextCreator)}.{nameof(IDbContextCreator.GetShellDbContext)}",
|
|
||||||
ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void GetOrCreateShardingRuntimeModel(DbContext dbContext)
|
public void GetOrCreateShardingRuntimeModel(DbContext dbContext)
|
||||||
{
|
{
|
||||||
|
|
|
@ -92,13 +92,19 @@ namespace ShardingCore.EFCores
|
||||||
await _shardingDbContext.CommitAsync(cancellationToken);
|
await _shardingDbContext.CommitAsync(cancellationToken);
|
||||||
_shardingDbContext.NotifyShardingTransaction();
|
_shardingDbContext.NotifyShardingTransaction();
|
||||||
}
|
}
|
||||||
// #if !NETCOREAPP3_0
|
#if !NETCOREAPP3_0&&!NETSTANDARD2_0
|
||||||
// public override void CreateSavepoint(string name)
|
// public override void CreateSavepoint(string name)
|
||||||
// {
|
// {
|
||||||
// AAA
|
// base.CreateSavepoint(name);
|
||||||
// base.CreateSavepoint(name);
|
// _shardingDbContext.CreateSavepoint(name);
|
||||||
// }
|
// }
|
||||||
// #endif
|
//
|
||||||
|
// public override async Task CreateSavepointAsync(string name, CancellationToken cancellationToken = new CancellationToken())
|
||||||
|
// {
|
||||||
|
// await base.CreateSavepointAsync(name, cancellationToken);
|
||||||
|
// await _shardingDbContext.CreateSavepointAsync(name,cancellationToken);
|
||||||
|
// }
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,3 +1,4 @@
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
@ -10,11 +11,6 @@ namespace ShardingCore.Extensions
|
||||||
|
|
||||||
public static class ShardingRuntimeExtension
|
public static class ShardingRuntimeExtension
|
||||||
{
|
{
|
||||||
public static void UseAutoShardingCreate(this IShardingRuntimeContext shardingRuntimeContext)
|
|
||||||
{
|
|
||||||
shardingRuntimeContext.CheckRequirement();
|
|
||||||
shardingRuntimeContext.AutoShardingCreate();
|
|
||||||
}
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 自动尝试补偿表
|
/// 自动尝试补偿表
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -22,7 +18,6 @@ namespace ShardingCore.Extensions
|
||||||
/// <param name="parallelCount"></param>
|
/// <param name="parallelCount"></param>
|
||||||
public static void UseAutoTryCompensateTable(this IShardingRuntimeContext shardingRuntimeContext, int? parallelCount = null)
|
public static void UseAutoTryCompensateTable(this IShardingRuntimeContext shardingRuntimeContext, int? parallelCount = null)
|
||||||
{
|
{
|
||||||
shardingRuntimeContext.CheckRequirement();
|
|
||||||
var virtualDataSource = shardingRuntimeContext.GetVirtualDataSource();
|
var virtualDataSource = shardingRuntimeContext.GetVirtualDataSource();
|
||||||
var dataSourceInitializer = shardingRuntimeContext.GetDataSourceInitializer();
|
var dataSourceInitializer = shardingRuntimeContext.GetDataSourceInitializer();
|
||||||
var shardingConfigOptions = shardingRuntimeContext.GetShardingConfigOptions();
|
var shardingConfigOptions = shardingRuntimeContext.GetShardingConfigOptions();
|
||||||
|
|
|
@ -91,6 +91,15 @@ namespace ShardingCore.Sharding.Abstractions
|
||||||
/// <param name="cancellationToken"></param>
|
/// <param name="cancellationToken"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task CommitAsync(CancellationToken cancellationToken = new CancellationToken());
|
Task CommitAsync(CancellationToken cancellationToken = new CancellationToken());
|
||||||
|
|
||||||
|
#if !NETCOREAPP3_0&&!NETSTANDARD2_0
|
||||||
|
// void CreateSavepoint(string name);
|
||||||
|
// Task CreateSavepointAsync(string name, CancellationToken cancellationToken = new CancellationToken());
|
||||||
|
// void RollbackToSavepoint(string name);
|
||||||
|
// Task RollbackToSavepointAsync(string name,CancellationToken cancellationToken = default(CancellationToken));
|
||||||
|
// void ReleaseSavepoint(string name);
|
||||||
|
// Task ReleaseSavepointAsync(string name, CancellationToken cancellationToken = default(CancellationToken));
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,14 @@ namespace ShardingCore.Sharding.Abstractions
|
||||||
#if !NETCOREAPP2_0
|
#if !NETCOREAPP2_0
|
||||||
Task RollbackAsync(CancellationToken cancellationToken = new CancellationToken());
|
Task RollbackAsync(CancellationToken cancellationToken = new CancellationToken());
|
||||||
Task CommitAsync(CancellationToken cancellationToken = new CancellationToken());
|
Task CommitAsync(CancellationToken cancellationToken = new CancellationToken());
|
||||||
|
#if !NETCOREAPP3_0 && !NETSTANDARD2_0
|
||||||
|
// void CreateSavepoint(string name);
|
||||||
|
// Task CreateSavepointAsync(string name, CancellationToken cancellationToken = new CancellationToken());
|
||||||
|
// void RollbackToSavepoint(string name);
|
||||||
|
// Task RollbackToSavepointAsync(string name,CancellationToken cancellationToken = default(CancellationToken));
|
||||||
|
// void ReleaseSavepoint(string name);
|
||||||
|
// Task ReleaseSavepointAsync(string name, CancellationToken cancellationToken = default(CancellationToken));
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -59,6 +59,15 @@ namespace ShardingCore.Sharding.MergeContexts
|
||||||
var orders = orderByContext.PropertyOrders;
|
var orders = orderByContext.PropertyOrders;
|
||||||
|
|
||||||
var combineQueryable = mergeQueryCompilerContext.GetQueryCombineResult().GetCombineQueryable();
|
var combineQueryable = mergeQueryCompilerContext.GetQueryCombineResult().GetCombineQueryable();
|
||||||
|
|
||||||
|
if (skip is < 0)
|
||||||
|
{
|
||||||
|
throw new ShardingCoreException($"queryable:{mergeQueryCompilerContext.GetQueryCombineResult().GetQueryCompilerContext().GetQueryExpression().ShardingPrint()} skip should >= 0");
|
||||||
|
}
|
||||||
|
if (take is < 0)
|
||||||
|
{
|
||||||
|
throw new ShardingCoreException($"queryable:{mergeQueryCompilerContext.GetQueryCombineResult().GetQueryCompilerContext().GetQueryExpression().ShardingPrint()} take should >= 0");
|
||||||
|
}
|
||||||
//去除分页,获取前Take+Skip数量
|
//去除分页,获取前Take+Skip数量
|
||||||
var reWriteQueryable = combineQueryable;
|
var reWriteQueryable = combineQueryable;
|
||||||
if (take.HasValue || skip.HasValue)
|
if (take.HasValue || skip.HasValue)
|
||||||
|
|
|
@ -13,7 +13,7 @@ namespace ShardingCore.Sharding.MergeEngines.ParallelControl
|
||||||
|
|
||||||
private const int Did = 1;
|
private const int Did = 1;
|
||||||
private const int UnDo = 0;
|
private const int UnDo = 0;
|
||||||
private int Status = UnDo;
|
private int Status = UnDo;
|
||||||
|
|
||||||
public bool IsUnDo()
|
public bool IsUnDo()
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
using System;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @Author: xjm
|
|
||||||
* @Description:
|
|
||||||
* @Date: DATE TIME
|
|
||||||
* @Email: 326308290@qq.com
|
|
||||||
*/
|
|
||||||
namespace ShardingCore.Sharding.ParseEngines
|
|
||||||
{
|
|
||||||
public class ParseEngine
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -18,7 +18,6 @@ using ShardingCore.Core.RuntimeContexts;
|
||||||
using ShardingCore.Exceptions;
|
using ShardingCore.Exceptions;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
using ShardingCore.Infrastructures;
|
using ShardingCore.Infrastructures;
|
||||||
|
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
|
|
||||||
namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
||||||
|
@ -32,11 +31,10 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
||||||
*/
|
*/
|
||||||
public class DataSourceDbContext : IDataSourceDbContext
|
public class DataSourceDbContext : IDataSourceDbContext
|
||||||
{
|
{
|
||||||
|
|
||||||
private static readonly IComparer<string> _comparer = new NoShardingFirstComparer();
|
private static readonly IComparer<string> _comparer = new NoShardingFirstComparer();
|
||||||
|
|
||||||
private readonly ILogger<DataSourceDbContext> _logger;
|
|
||||||
public Type DbContextType { get; }
|
public Type DbContextType { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 当前是否是默认的dbcontext 也就是不分片的dbcontext
|
/// 当前是否是默认的dbcontext 也就是不分片的dbcontext
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -82,6 +80,7 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
||||||
/// shell dbcontext最外面的壳
|
/// shell dbcontext最外面的壳
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private readonly DbContext _shardingShellDbContext;
|
private readonly DbContext _shardingShellDbContext;
|
||||||
|
|
||||||
private readonly IShardingRuntimeContext _shardingRuntimeContext;
|
private readonly IShardingRuntimeContext _shardingRuntimeContext;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -117,8 +116,7 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
||||||
bool isDefault,
|
bool isDefault,
|
||||||
DbContext shardingShellDbContext,
|
DbContext shardingShellDbContext,
|
||||||
IDbContextCreator dbContextCreator,
|
IDbContextCreator dbContextCreator,
|
||||||
ActualConnectionStringManager actualConnectionStringManager,
|
ActualConnectionStringManager actualConnectionStringManager)
|
||||||
ILogger<DataSourceDbContext> logger)
|
|
||||||
{
|
{
|
||||||
var shardingDbContext = (IShardingDbContext)shardingShellDbContext;
|
var shardingDbContext = (IShardingDbContext)shardingShellDbContext;
|
||||||
DataSourceName = dataSourceName;
|
DataSourceName = dataSourceName;
|
||||||
|
@ -126,11 +124,10 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
||||||
_shardingShellDbContext = shardingShellDbContext;
|
_shardingShellDbContext = shardingShellDbContext;
|
||||||
_shardingRuntimeContext = shardingShellDbContext.GetShardingRuntimeContext();
|
_shardingRuntimeContext = shardingShellDbContext.GetShardingRuntimeContext();
|
||||||
DbContextType = shardingShellDbContext.GetType();
|
DbContextType = shardingShellDbContext.GetType();
|
||||||
_virtualDataSource =shardingDbContext
|
_virtualDataSource = shardingDbContext
|
||||||
.GetVirtualDataSource();
|
.GetVirtualDataSource();
|
||||||
_dbContextCreator = dbContextCreator;
|
_dbContextCreator = dbContextCreator;
|
||||||
_actualConnectionStringManager = actualConnectionStringManager;
|
_actualConnectionStringManager = actualConnectionStringManager;
|
||||||
this._logger = logger;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -155,8 +152,9 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
||||||
{
|
{
|
||||||
//先创建dbcontext option builder
|
//先创建dbcontext option builder
|
||||||
var dbContextOptionBuilderCreator = _shardingRuntimeContext.GetDbContextOptionBuilderCreator();
|
var dbContextOptionBuilderCreator = _shardingRuntimeContext.GetDbContextOptionBuilderCreator();
|
||||||
var dbContextOptionsBuilder = dbContextOptionBuilderCreator.CreateDbContextOptionBuilder().UseShardingOptions(_shardingRuntimeContext);
|
var dbContextOptionsBuilder = dbContextOptionBuilderCreator.CreateDbContextOptionBuilder()
|
||||||
|
.UseShardingOptions(_shardingRuntimeContext);
|
||||||
|
|
||||||
if (IsDefault)
|
if (IsDefault)
|
||||||
{
|
{
|
||||||
//如果是默认的需要使用shell的dbconnection为了保证可以使用事务
|
//如果是默认的需要使用shell的dbconnection为了保证可以使用事务
|
||||||
|
@ -342,34 +340,17 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
||||||
{
|
{
|
||||||
if (IsDefault)
|
if (IsDefault)
|
||||||
return;
|
return;
|
||||||
try
|
CurrentDbContextTransaction?.Rollback();
|
||||||
{
|
|
||||||
CurrentDbContextTransaction?.Rollback();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
_logger.LogError(e, "rollback error.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 提交数据
|
/// 提交数据
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dataSourceCount">如果只有一个数据源那么就直接报错否则就忽略</param>
|
public void Commit()
|
||||||
public void Commit(int dataSourceCount)
|
|
||||||
{
|
{
|
||||||
if (IsDefault)
|
if (IsDefault)
|
||||||
return;
|
return;
|
||||||
try
|
CurrentDbContextTransaction?.Commit();
|
||||||
{
|
|
||||||
CurrentDbContextTransaction?.Commit();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
_logger.LogError(e, "commit error.");
|
|
||||||
if (dataSourceCount == 1)
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#if !NETCOREAPP2_0
|
#if !NETCOREAPP2_0
|
||||||
public async Task RollbackAsync(CancellationToken cancellationToken = new CancellationToken())
|
public async Task RollbackAsync(CancellationToken cancellationToken = new CancellationToken())
|
||||||
|
@ -377,35 +358,70 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
if (IsDefault)
|
if (IsDefault)
|
||||||
return;
|
return;
|
||||||
try
|
if (CurrentDbContextTransaction != null)
|
||||||
{
|
await CurrentDbContextTransaction.RollbackAsync(cancellationToken);
|
||||||
if (CurrentDbContextTransaction != null)
|
|
||||||
await CurrentDbContextTransaction.RollbackAsync(cancellationToken);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
_logger.LogError(e, "rollback error.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task CommitAsync(int dataSourceCount, CancellationToken cancellationToken =
|
public async Task CommitAsync(CancellationToken cancellationToken =
|
||||||
new CancellationToken())
|
new CancellationToken())
|
||||||
{
|
{
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
if (IsDefault)
|
if (IsDefault)
|
||||||
return;
|
return;
|
||||||
try
|
if (CurrentDbContextTransaction != null)
|
||||||
{
|
await CurrentDbContextTransaction.CommitAsync(cancellationToken);
|
||||||
if (CurrentDbContextTransaction != null)
|
|
||||||
await CurrentDbContextTransaction.CommitAsync(cancellationToken);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
_logger.LogError(e, "commit error.");
|
|
||||||
if (dataSourceCount == 1)
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
#if !NETCOREAPP3_0&&!NETSTANDARD2_0
|
||||||
|
// public void CreateSavepoint(string name)
|
||||||
|
// {
|
||||||
|
// if (IsDefault)
|
||||||
|
// return;
|
||||||
|
// CurrentDbContextTransaction?.CreateSavepoint(name);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public async Task CreateSavepointAsync(string name,
|
||||||
|
// CancellationToken cancellationToken = new CancellationToken())
|
||||||
|
// {
|
||||||
|
// cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
// if (IsDefault)
|
||||||
|
// return;
|
||||||
|
// if (CurrentDbContextTransaction != null)
|
||||||
|
// await CurrentDbContextTransaction.CreateSavepointAsync(name, cancellationToken);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public void RollbackToSavepoint(string name)
|
||||||
|
// {
|
||||||
|
// if (IsDefault)
|
||||||
|
// return;
|
||||||
|
// CurrentDbContextTransaction?.RollbackToSavepoint(name);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public async Task RollbackToSavepointAsync(string name,
|
||||||
|
// CancellationToken cancellationToken = default(CancellationToken))
|
||||||
|
// {
|
||||||
|
// cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
// if (IsDefault)
|
||||||
|
// return;
|
||||||
|
// if (CurrentDbContextTransaction != null)
|
||||||
|
// await CurrentDbContextTransaction.RollbackToSavepointAsync(name, cancellationToken);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public void ReleaseSavepoint(string name)
|
||||||
|
// {
|
||||||
|
// if (IsDefault)
|
||||||
|
// return;
|
||||||
|
// CurrentDbContextTransaction?.ReleaseSavepoint(name);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public async Task ReleaseSavepointAsync(string name, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
|
// {
|
||||||
|
// cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
// if (IsDefault)
|
||||||
|
// return;
|
||||||
|
// if (CurrentDbContextTransaction != null)
|
||||||
|
// await CurrentDbContextTransaction.ReleaseSavepointAsync(name, cancellationToken);
|
||||||
|
// }
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
|
|
|
@ -45,10 +45,18 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
||||||
IDictionary<string, DbContext> GetCurrentContexts();
|
IDictionary<string, DbContext> GetCurrentContexts();
|
||||||
|
|
||||||
void Rollback();
|
void Rollback();
|
||||||
void Commit(int dataSourceCount);
|
void Commit();
|
||||||
#if !NETCOREAPP2_0
|
#if !NETCOREAPP2_0
|
||||||
Task RollbackAsync(CancellationToken cancellationToken = new CancellationToken());
|
Task RollbackAsync(CancellationToken cancellationToken = new CancellationToken());
|
||||||
Task CommitAsync(int dataSourceCount,CancellationToken cancellationToken = new CancellationToken());
|
Task CommitAsync(CancellationToken cancellationToken = new CancellationToken());
|
||||||
|
#if !NETCOREAPP3_0&&!NETSTANDARD2_0
|
||||||
|
// void CreateSavepoint(string name);
|
||||||
|
// Task CreateSavepointAsync(string name, CancellationToken cancellationToken = new CancellationToken());
|
||||||
|
// void RollbackToSavepoint(string name);
|
||||||
|
// Task RollbackToSavepointAsync(string name,CancellationToken cancellationToken = default(CancellationToken));
|
||||||
|
// void ReleaseSavepoint(string name);
|
||||||
|
// Task ReleaseSavepointAsync(string name, CancellationToken cancellationToken = default(CancellationToken));
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
||||||
/// <typeparam name="TShardingDbContext"></typeparam>
|
/// <typeparam name="TShardingDbContext"></typeparam>
|
||||||
public class ShardingDbContextExecutor : IShardingDbContextExecutor
|
public class ShardingDbContextExecutor : IShardingDbContextExecutor
|
||||||
{
|
{
|
||||||
private readonly ILoggerFactory _loggerFactory;
|
private readonly ILogger<ShardingDbContextExecutor> _logger;
|
||||||
private readonly DbContext _shardingDbContext;
|
private readonly DbContext _shardingDbContext;
|
||||||
|
|
||||||
//private readonly ConcurrentDictionary<string, ConcurrentDictionary<string, DbContext>> _dbContextCaches = new ConcurrentDictionary<string, ConcurrentDictionary<string, DbContext>>();
|
//private readonly ConcurrentDictionary<string, ConcurrentDictionary<string, DbContext>> _dbContextCaches = new ConcurrentDictionary<string, ConcurrentDictionary<string, DbContext>>();
|
||||||
|
@ -78,7 +78,8 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
||||||
_routeTailFactory = _shardingRuntimeContext.GetRouteTailFactory();
|
_routeTailFactory = _shardingRuntimeContext.GetRouteTailFactory();
|
||||||
var shardingReadWriteManager = _shardingRuntimeContext.GetShardingReadWriteManager();
|
var shardingReadWriteManager = _shardingRuntimeContext.GetShardingReadWriteManager();
|
||||||
var shardingProvider = _shardingRuntimeContext.GetShardingProvider();
|
var shardingProvider = _shardingRuntimeContext.GetShardingProvider();
|
||||||
_loggerFactory=shardingProvider.GetService<ILoggerFactory>();
|
var loggerFactory=shardingProvider.GetRequiredService<ILoggerFactory>();
|
||||||
|
_logger=loggerFactory.CreateLogger<ShardingDbContextExecutor>();
|
||||||
_actualConnectionStringManager = new ActualConnectionStringManager(shardingReadWriteManager,_virtualDataSource);
|
_actualConnectionStringManager = new ActualConnectionStringManager(shardingReadWriteManager,_virtualDataSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,7 +87,7 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
||||||
|
|
||||||
private IDataSourceDbContext GetDataSourceDbContext(string dataSourceName)
|
private IDataSourceDbContext GetDataSourceDbContext(string dataSourceName)
|
||||||
{
|
{
|
||||||
return _dbContextCaches.GetOrAdd(dataSourceName, dsname => new DataSourceDbContext(dsname, _virtualDataSource.IsDefault(dsname), _shardingDbContext, _dbContextCreator, _actualConnectionStringManager,_loggerFactory.CreateLogger<DataSourceDbContext>()));
|
return _dbContextCaches.GetOrAdd(dataSourceName, dsname => new DataSourceDbContext(dsname, _virtualDataSource.IsDefault(dsname), _shardingDbContext, _dbContextCreator, _actualConnectionStringManager));
|
||||||
|
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -194,9 +195,20 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
||||||
|
|
||||||
public void Commit()
|
public void Commit()
|
||||||
{
|
{
|
||||||
|
int i = 0;
|
||||||
foreach (var dbContextCache in _dbContextCaches)
|
foreach (var dbContextCache in _dbContextCaches)
|
||||||
{
|
{
|
||||||
dbContextCache.Value.Commit(_dbContextCaches.Count);
|
try
|
||||||
|
{
|
||||||
|
dbContextCache.Value.Commit();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
_logger.LogError(e, "commit error.");
|
||||||
|
if (i == 0)
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
AutoUseWriteConnectionString();
|
AutoUseWriteConnectionString();
|
||||||
|
@ -231,9 +243,20 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
||||||
|
|
||||||
public async Task CommitAsync(CancellationToken cancellationToken = new CancellationToken())
|
public async Task CommitAsync(CancellationToken cancellationToken = new CancellationToken())
|
||||||
{
|
{
|
||||||
|
int i = 0;
|
||||||
foreach (var dbContextCache in _dbContextCaches)
|
foreach (var dbContextCache in _dbContextCaches)
|
||||||
{
|
{
|
||||||
await dbContextCache.Value.CommitAsync(_dbContextCaches.Count, cancellationToken);
|
try
|
||||||
|
{
|
||||||
|
await dbContextCache.Value.CommitAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
_logger.LogError(e, "commit error.");
|
||||||
|
if (i == 0)
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
AutoUseWriteConnectionString();
|
AutoUseWriteConnectionString();
|
||||||
|
|
|
@ -3,9 +3,6 @@ using ShardingCore.Core.QueryRouteManagers;
|
||||||
using ShardingCore.Core.QueryRouteManagers.Abstractions;
|
using ShardingCore.Core.QueryRouteManagers.Abstractions;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
using ShardingCore.Sharding.Parsers.Abstractions;
|
using ShardingCore.Sharding.Parsers.Abstractions;
|
||||||
using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions;
|
|
||||||
using ShardingCore.Sharding.ShardingExecutors;
|
|
||||||
using ShardingCore.Sharding.ShardingExecutors.Abstractions;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @Author: xjm
|
* @Author: xjm
|
||||||
|
@ -13,7 +10,7 @@ using ShardingCore.Sharding.ShardingExecutors.Abstractions;
|
||||||
* @Date: DATE TIME
|
* @Date: DATE TIME
|
||||||
* @Email: 326308290@qq.com
|
* @Email: 326308290@qq.com
|
||||||
*/
|
*/
|
||||||
namespace ShardingCore.ShardingExecutors
|
namespace ShardingCore.Sharding.ShardingExecutors
|
||||||
{
|
{
|
||||||
internal class CustomerQueryScope:IDisposable
|
internal class CustomerQueryScope:IDisposable
|
||||||
{
|
{
|
||||||
|
|
|
@ -10,7 +10,6 @@ using ShardingCore.Extensions;
|
||||||
using ShardingCore.Sharding.Parsers.Abstractions;
|
using ShardingCore.Sharding.Parsers.Abstractions;
|
||||||
using ShardingCore.Sharding.ShardingExecutors.Abstractions;
|
using ShardingCore.Sharding.ShardingExecutors.Abstractions;
|
||||||
using ShardingCore.Sharding.Visitors.ShardingExtractParameters;
|
using ShardingCore.Sharding.Visitors.ShardingExtractParameters;
|
||||||
using ShardingCore.ShardingExecutors;
|
|
||||||
|
|
||||||
namespace ShardingCore.Sharding.ShardingExecutors
|
namespace ShardingCore.Sharding.ShardingExecutors
|
||||||
{
|
{
|
||||||
|
|
|
@ -271,13 +271,12 @@ namespace ShardingCore
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 启用定时任务自动创建表
|
/// 当前接口可以直接移除掉,定时任务会在shardingcore初始化的时候自动调用
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="serviceProvider"></param>
|
/// <param name="serviceProvider"></param>
|
||||||
|
[Obsolete("can remove this method,sharding core auto invoke.")]
|
||||||
public static void UseAutoShardingCreate(this IServiceProvider serviceProvider)
|
public static void UseAutoShardingCreate(this IServiceProvider serviceProvider)
|
||||||
{
|
{
|
||||||
var shardingRuntimeContext = serviceProvider.GetRequiredService<IShardingRuntimeContext>();
|
|
||||||
shardingRuntimeContext.UseAutoShardingCreate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -81,6 +81,7 @@ namespace ShardingCore.VirtualRoutes.Abstractions
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public abstract bool AutoCreateTableByTime();
|
public abstract bool AutoCreateTableByTime();
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 显示错误日志
|
/// 显示错误日志
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -140,21 +141,24 @@ namespace ShardingCore.VirtualRoutes.Abstractions
|
||||||
|
|
||||||
logger.LogInformation($"auto create table data source names:[{string.Join(",", dataSources)}]");
|
logger.LogInformation($"auto create table data source names:[{string.Join(",", dataSources)}]");
|
||||||
|
|
||||||
foreach (var dataSource in dataSources)
|
if (AutoCreateTableByTime())
|
||||||
{
|
{
|
||||||
try
|
foreach (var dataSource in dataSources)
|
||||||
{
|
{
|
||||||
logger.LogInformation($"begin table tail:[{tail}],entity:[{typeof(TEntity).Name}]");
|
try
|
||||||
tableCreator.CreateTable(dataSource, typeof(TEntity), tail);
|
{
|
||||||
logger.LogInformation($"succeed table tail:[{tail}],entity:[{typeof(TEntity).Name}]");
|
logger.LogInformation($"begin table tail:[{tail}],entity:[{typeof(TEntity).Name}]");
|
||||||
}
|
tableCreator.CreateTable(dataSource, typeof(TEntity), tail);
|
||||||
catch (Exception e)
|
logger.LogInformation($"succeed table tail:[{tail}],entity:[{typeof(TEntity).Name}]");
|
||||||
{
|
}
|
||||||
//ignore
|
catch (Exception e)
|
||||||
logger.LogInformation($"warning table tail:[{tail}],entity:[{typeof(TEntity).Name}]");
|
{
|
||||||
if (DoLogError)
|
//ignore
|
||||||
logger.LogError(e, $"{dataSource} {typeof(TEntity).Name}'s create table error ");
|
logger.LogInformation($"warning table tail:[{tail}],entity:[{typeof(TEntity).Name}]");
|
||||||
}
|
if (DoLogError)
|
||||||
|
logger.LogError(e, $"{dataSource} {typeof(TEntity).Name}'s create table error ");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
@ -162,7 +166,7 @@ namespace ShardingCore.VirtualRoutes.Abstractions
|
||||||
|
|
||||||
public bool AppendJob()
|
public bool AppendJob()
|
||||||
{
|
{
|
||||||
return AutoCreateTableByTime();
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue