添加表达式缓存,获取默认字符串优化,发布x.3.1.62
This commit is contained in:
parent
c23d72bca3
commit
0d59baa5cb
|
@ -11,13 +11,16 @@ using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using ShardingCore;
|
using ShardingCore;
|
||||||
using ShardingCore.Bootstrapers;
|
using ShardingCore.Bootstrapers;
|
||||||
|
using ShardingCore.Core.VirtualDatabase.VirtualDataSources;
|
||||||
using ShardingCore.Core.VirtualDatabase.VirtualTables;
|
using ShardingCore.Core.VirtualDatabase.VirtualTables;
|
||||||
using ShardingCore.Core.VirtualRoutes.TableRoutes;
|
using ShardingCore.Core.VirtualRoutes.TableRoutes;
|
||||||
using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions;
|
using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions;
|
||||||
using ShardingCore.Core.VirtualTables;
|
using ShardingCore.Core.VirtualTables;
|
||||||
using ShardingCore.Exceptions;
|
using ShardingCore.Exceptions;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
|
using ShardingCore.Sharding;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
|
using ShardingCore.Sharding.ShardingDbContextExecutors;
|
||||||
using ShardingCore6x.NoShardingDbContexts;
|
using ShardingCore6x.NoShardingDbContexts;
|
||||||
using ShardingCore6x.ShardingDbContexts;
|
using ShardingCore6x.ShardingDbContexts;
|
||||||
|
|
||||||
|
@ -32,20 +35,24 @@ namespace ShardingCore6x
|
||||||
private readonly IVirtualTable<Order> _virtualTable;
|
private readonly IVirtualTable<Order> _virtualTable;
|
||||||
private readonly IRouteTailFactory _routeTailFactory;
|
private readonly IRouteTailFactory _routeTailFactory;
|
||||||
private readonly IStreamMergeContextFactory<DefaultShardingDbContext> _streamMergeContextFactory;
|
private readonly IStreamMergeContextFactory<DefaultShardingDbContext> _streamMergeContextFactory;
|
||||||
|
private readonly ActualConnectionStringManager<DefaultShardingDbContext> _actualConnectionStringManager;
|
||||||
|
private readonly IVirtualDataSource<DefaultShardingDbContext> _virtualDataSource;
|
||||||
public EFCoreCrud()
|
public EFCoreCrud()
|
||||||
{
|
{
|
||||||
var services = new ServiceCollection();
|
var services = new ServiceCollection();
|
||||||
|
|
||||||
services.AddDbContext<DefaultDbContext>(o => o.UseSqlServer("Data Source=localhost;Initial Catalog=db1;Integrated Security=True;"), ServiceLifetime.Transient, ServiceLifetime.Transient);
|
services.AddDbContext<DefaultDbContext>(o => o.UseMySql("server=127.0.0.1;port=3306;database=db1;userid=root;password=;", new MySqlServerVersion(new Version()))
|
||||||
|
//UseSqlServer("Data Source=localhost;Initial Catalog=db1;Integrated Security=True;")
|
||||||
|
, ServiceLifetime.Transient, ServiceLifetime.Transient);
|
||||||
services.AddLogging();
|
services.AddLogging();
|
||||||
services.AddShardingDbContext<DefaultShardingDbContext>((conStr, builder) => builder.UseSqlServer(conStr), ServiceLifetime.Transient, ServiceLifetime.Transient)
|
services.AddShardingDbContext<DefaultShardingDbContext>((conStr, builder) => builder.UseMySql(conStr, new MySqlServerVersion(new Version())), ServiceLifetime.Transient, ServiceLifetime.Transient)
|
||||||
.Begin(o =>
|
.Begin(o =>
|
||||||
{
|
{
|
||||||
o.CreateShardingTableOnStart = true;
|
o.CreateShardingTableOnStart = true;
|
||||||
o.EnsureCreatedWithOutShardingTable = true;
|
o.EnsureCreatedWithOutShardingTable = true;
|
||||||
o.AutoTrackEntity = false;
|
o.AutoTrackEntity = false;
|
||||||
}).AddShardingTransaction((connection, builder) => builder.UseSqlServer(connection))
|
}).AddShardingTransaction((connection, builder) => builder.UseMySql(connection, new MySqlServerVersion(new Version())))
|
||||||
.AddDefaultDataSource("ds0", "Data Source=localhost;Initial Catalog=db2;Integrated Security=True;")
|
.AddDefaultDataSource("ds0", "server=127.0.0.1;port=3306;database=db2;userid=root;password=;")//"Data Source=localhost;Initial Catalog=db2;Integrated Security=True;")
|
||||||
.AddShardingTableRoute(op =>
|
.AddShardingTableRoute(op =>
|
||||||
{
|
{
|
||||||
op.AddShardingTableRoute<OrderVirtualTableRoute>();
|
op.AddShardingTableRoute<OrderVirtualTableRoute>();
|
||||||
|
@ -107,9 +114,11 @@ namespace ShardingCore6x
|
||||||
_defaultShardingDbContext = ShardingContainer.GetService<DefaultShardingDbContext>();
|
_defaultShardingDbContext = ShardingContainer.GetService<DefaultShardingDbContext>();
|
||||||
_virtualTableManager = ShardingContainer.GetService<IVirtualTableManager<DefaultShardingDbContext>>();
|
_virtualTableManager = ShardingContainer.GetService<IVirtualTableManager<DefaultShardingDbContext>>();
|
||||||
_virtualTable = _virtualTableManager.GetVirtualTable<Order>();
|
_virtualTable = _virtualTableManager.GetVirtualTable<Order>();
|
||||||
_routeTailFactory= ShardingContainer.GetService<IRouteTailFactory>();
|
_routeTailFactory = ShardingContainer.GetService<IRouteTailFactory>();
|
||||||
_streamMergeContextFactory =
|
_streamMergeContextFactory =
|
||||||
ShardingContainer.GetService<IStreamMergeContextFactory<DefaultShardingDbContext>>();
|
ShardingContainer.GetService<IStreamMergeContextFactory<DefaultShardingDbContext>>();
|
||||||
|
_actualConnectionStringManager = new ActualConnectionStringManager<DefaultShardingDbContext>();
|
||||||
|
_virtualDataSource = ShardingContainer.GetService<IVirtualDataSource<DefaultShardingDbContext>>();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,16 +127,45 @@ namespace ShardingCore6x
|
||||||
public int N;
|
public int N;
|
||||||
|
|
||||||
|
|
||||||
[Benchmark]
|
//private static readonly string[] aa = new string[] { "a", "b", "c", "d" };
|
||||||
public async Task NoRouteParseCache()
|
//[Benchmark]
|
||||||
{
|
//public void ShardingCreateDbContextFirstOrDefault()
|
||||||
for (int i = 0; i < N; i++)
|
//{
|
||||||
{
|
// for (int i = 0; i < N; i++)
|
||||||
var next = new Random().Next(1, 3000000).ToString();
|
// {
|
||||||
var queryable = _defaultShardingDbContext.Set<Order>().Where(o => o.Id == next);
|
|
||||||
_virtualTable.RouteTo(new ShardingTableRouteConfig(queryable: queryable));
|
// var routeTail = _routeTailFactory.Create(aa[i % 4]);
|
||||||
}
|
// var dbContext = _defaultShardingDbContext.GetDbContext("ds0", true, routeTail);
|
||||||
}
|
// }
|
||||||
|
//}
|
||||||
|
//[Benchmark]
|
||||||
|
//public void ActualConnectionStringManager()
|
||||||
|
//{
|
||||||
|
// for (int i = 0; i < N; i++)
|
||||||
|
// {
|
||||||
|
// var connectionString = _actualConnectionStringManager.GetConnectionString("ds0", false);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//[Benchmark]
|
||||||
|
//public async Task ShardingCreateStreamMergeContext()
|
||||||
|
//{
|
||||||
|
// for (int i = 0; i < N; i++)
|
||||||
|
// {
|
||||||
|
// var next = new Random().Next(1000000, 3000000).ToString();
|
||||||
|
// var queryable = _defaultShardingDbContext.Set<Order>().Where(o => o.Id == next);
|
||||||
|
// var firstOrDefaultAsync = _streamMergeContextFactory.Create(queryable, _defaultShardingDbContext);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//[Benchmark]
|
||||||
|
//public async Task NoRouteParseCache()
|
||||||
|
//{
|
||||||
|
// for (int i = 0; i < N; i++)
|
||||||
|
// {
|
||||||
|
// var next = new Random().Next(1, 3000000).ToString();
|
||||||
|
// var queryable = _defaultShardingDbContext.Set<Order>().Where(o => o.Id == next);
|
||||||
|
// _virtualTable.RouteTo(new ShardingTableRouteConfig(queryable: queryable));
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
//[Benchmark]
|
//[Benchmark]
|
||||||
//public async Task ShardingFirstOrDefaultAsync()
|
//public async Task ShardingFirstOrDefaultAsync()
|
||||||
|
@ -145,7 +183,7 @@ namespace ShardingCore6x
|
||||||
{
|
{
|
||||||
for (int i = 0; i < N; i++)
|
for (int i = 0; i < N; i++)
|
||||||
{
|
{
|
||||||
var next = new Random().Next(1, 3000000).ToString();
|
var next = new Random().Next(1, 7000000).ToString();
|
||||||
var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Id == next);
|
var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Id == next);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -154,7 +192,7 @@ namespace ShardingCore6x
|
||||||
{
|
{
|
||||||
for (int i = 0; i < N; i++)
|
for (int i = 0; i < N; i++)
|
||||||
{
|
{
|
||||||
var next = new Random().Next(1, 3000000).ToString();
|
var next = new Random().Next(1, 7000000).ToString();
|
||||||
var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Id == next);
|
var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Id == next);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -178,100 +216,120 @@ namespace ShardingCore6x
|
||||||
// var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Id == next);
|
// var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Id == next);
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
//[Benchmark]
|
[Benchmark]
|
||||||
//public async Task NoShardingNoIndexFirstOrDefaultAsync100w()
|
public async Task NoShardingNoIndexFirstOrDefaultAsync()
|
||||||
//{
|
{
|
||||||
// for (int i = 0; i < N; i++)
|
for (int i = 0; i < N; i++)
|
||||||
// {
|
{
|
||||||
// var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 1000000);
|
var firstOrDefaultAsync1 = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 0);
|
||||||
// }
|
var firstOrDefaultAsync2 = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 999999);
|
||||||
//}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//[Benchmark]
|
[Benchmark]
|
||||||
//public async Task ShardingNoIndexFirstOrDefaultAsync100w()
|
public async Task ShardingNoIndexFirstOrDefaultAsync()
|
||||||
//{
|
{
|
||||||
// for (int i = 0; i < N; i++)
|
for (int i = 0; i < N; i++)
|
||||||
// {
|
{
|
||||||
// var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 1000000);
|
var firstOrDefaultAsync1 = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 0);
|
||||||
// }
|
var firstOrDefaultAsync2 = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 999999);
|
||||||
//}
|
}
|
||||||
//[Benchmark]
|
}
|
||||||
//public async Task NoShardingNoIndexCountAsync()
|
[Benchmark]
|
||||||
//{
|
public async Task NoShardingNoIndexCountAsync()
|
||||||
// for (int i = 0; i < N; i++)
|
{
|
||||||
// {
|
for (int i = 0; i < N; i++)
|
||||||
// var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().CountAsync(o => o.Amount == 3000000);
|
{
|
||||||
// }
|
var firstOrDefaultAsync1 = await _defaultDbContext.Set<Order>().CountAsync(o => o.Amount == 0);
|
||||||
//}
|
var firstOrDefaultAsync2 = await _defaultDbContext.Set<Order>().CountAsync(o => o.Amount == 999999);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//[Benchmark]
|
[Benchmark]
|
||||||
//public async Task ShardingNoIndexCountASYNC()
|
public async Task ShardingNoIndexCountAsync()
|
||||||
//{
|
{
|
||||||
// for (int i = 0; i < N; i++)
|
for (int i = 0; i < N; i++)
|
||||||
// {
|
{
|
||||||
// var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().CountAsync(o => o.Amount == 3000000);
|
var firstOrDefaultAsync1 = await _defaultShardingDbContext.Set<Order>().CountAsync(o => o.Amount == 0);
|
||||||
// }
|
var firstOrDefaultAsync2 = await _defaultShardingDbContext.Set<Order>().CountAsync(o => o.Amount == 999999);
|
||||||
//}
|
}
|
||||||
//[Benchmark]
|
}
|
||||||
//public async Task NoShardingNoIndexFirstOrDefaultAsync600w()
|
[Benchmark]
|
||||||
//{
|
public async Task NoShardingNoIndexFirstOrDefaultAsync0w()
|
||||||
// for (int i = 0; i < N; i++)
|
{
|
||||||
// {
|
for (int i = 0; i < N; i++)
|
||||||
// var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 6000000);
|
{
|
||||||
// }
|
var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 0);
|
||||||
//}
|
}
|
||||||
//[Benchmark]
|
}
|
||||||
//public async Task ShardingNoIndexFirstOrDefaultAsync600w()
|
[Benchmark]
|
||||||
//{
|
public async Task ShardingNoIndexFirstOrDefaultAsync0w()
|
||||||
// for (int i = 0; i < N; i++)
|
{
|
||||||
// {
|
for (int i = 0; i < N; i++)
|
||||||
// var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 6000000);
|
{
|
||||||
// }
|
var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 0);
|
||||||
//}
|
}
|
||||||
|
}
|
||||||
|
[Benchmark]
|
||||||
|
public async Task NoShardingNoIndexFirstOrDefaultAsync99w()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < N; i++)
|
||||||
|
{
|
||||||
|
var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 999999);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[Benchmark]
|
||||||
|
public async Task ShardingNoIndexFirstOrDefaultAsync99w()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < N; i++)
|
||||||
|
{
|
||||||
|
var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 999999);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//[Benchmark]
|
[Benchmark]
|
||||||
//public async Task NoShardingNoIndexLikeToListAsync()
|
public async Task NoShardingNoIndexLikeToListAsync()
|
||||||
//{
|
{
|
||||||
// for (int i = 0; i < N; i++)
|
for (int i = 0; i < N; i++)
|
||||||
// {
|
{
|
||||||
// var next = new Random().Next(1, 8000000).ToString();
|
var next = new Random().Next(1, 7000000).ToString();
|
||||||
// var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().Where(o => o.Body.Contains(next)).FirstOrDefaultAsync();
|
var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().Where(o => o.Body.Contains(next)).ToListAsync();
|
||||||
// }
|
}
|
||||||
//}
|
}
|
||||||
|
|
||||||
|
|
||||||
//[Benchmark]
|
[Benchmark]
|
||||||
//public async Task ShardingNoIndexLikeToListAsync()
|
public async Task ShardingNoIndexLikeToListAsync()
|
||||||
//{
|
{
|
||||||
// for (int i = 0; i < N; i++)
|
for (int i = 0; i < N; i++)
|
||||||
// {
|
{
|
||||||
// var next = new Random().Next(1, 8000000).ToString();
|
var next = new Random().Next(1, 7000000).ToString();
|
||||||
// var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().Where(o => o.Body.Contains(next)).FirstOrDefaultAsync();
|
var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().Where(o => o.Body.Contains(next)).ToListAsync();
|
||||||
// }
|
}
|
||||||
//}
|
}
|
||||||
//[Benchmark]
|
[Benchmark]
|
||||||
//public async Task NoShardingNoIndexToListAsync()
|
public async Task NoShardingNoIndexToListAsync()
|
||||||
//{
|
{
|
||||||
// for (int i = 0; i < N; i++)
|
for (int i = 0; i < N; i++)
|
||||||
// {
|
{
|
||||||
// var next = new Random().Next(5000000, 7000000);
|
var next = new Random().Next(1, 7000000);
|
||||||
// var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().Where(o => o.Amount == next).ToListAsync();
|
var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().Where(o => o.Amount == next).ToListAsync();
|
||||||
// }
|
}
|
||||||
//}
|
}
|
||||||
|
|
||||||
|
|
||||||
//[Benchmark]
|
[Benchmark]
|
||||||
//public async Task ShardingNoIndexToListAsync()
|
public async Task ShardingNoIndexToListAsync()
|
||||||
//{
|
{
|
||||||
// for (int i = 0; i < N; i++)
|
for (int i = 0; i < N; i++)
|
||||||
// {
|
{
|
||||||
// var next = new Random().Next(5000000, 7000000);
|
var next = new Random().Next(1, 7000000);
|
||||||
// var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().Where(o => o.Amount == next).ToListAsync();
|
var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().Where(o => o.Amount == next).ToListAsync();
|
||||||
// }
|
}
|
||||||
//}
|
}
|
||||||
//[Benchmark]
|
//[Benchmark]
|
||||||
//public void ShardingRouteFirstOrDefault()
|
//public void ShardingRouteFirstOrDefault()
|
||||||
//{
|
//{
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
|
@ -12,6 +12,8 @@
|
||||||
<PackageReference Include="BenchmarkDotNet" Version="0.13.1" />
|
<PackageReference Include="BenchmarkDotNet" Version="0.13.1" />
|
||||||
<PackageReference Include="EFCore.BulkExtensions" Version="6.1.1" />
|
<PackageReference Include="EFCore.BulkExtensions" Version="6.1.1" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.0" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.0" />
|
||||||
|
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="6.0.0" />
|
||||||
|
<PackageReference Include="Z.EntityFramework.Plus.EFCore" Version="6.13.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -11,6 +11,8 @@ namespace ShardingCore6x.ShardingDbContexts
|
||||||
{
|
{
|
||||||
internal class OrderVirtualTableRoute:AbstractSimpleShardingModKeyStringVirtualTableRoute<Order>
|
internal class OrderVirtualTableRoute:AbstractSimpleShardingModKeyStringVirtualTableRoute<Order>
|
||||||
{
|
{
|
||||||
|
public override bool EnableRouteParseCompileCache => true;
|
||||||
|
|
||||||
public OrderVirtualTableRoute() : base(2, 5)
|
public OrderVirtualTableRoute() : base(2, 5)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 98 KiB |
Binary file not shown.
After Width: | Height: | Size: 99 KiB |
|
@ -1,9 +1,9 @@
|
||||||
:start
|
:start
|
||||||
::定义版本
|
::定义版本
|
||||||
set EFCORE2=2.3.1.61
|
set EFCORE2=2.3.1.62
|
||||||
set EFCORE3=3.3.1.61
|
set EFCORE3=3.3.1.62
|
||||||
set EFCORE5=5.3.1.61
|
set EFCORE5=5.3.1.62
|
||||||
set EFCORE6=6.3.1.61
|
set EFCORE6=6.3.1.62
|
||||||
|
|
||||||
::删除所有bin与obj下的文件
|
::删除所有bin与obj下的文件
|
||||||
@echo off
|
@echo off
|
||||||
|
|
|
@ -78,6 +78,7 @@ namespace ShardingCore.Bootstrapers
|
||||||
_virtualDataSource.AddPhysicDataSource(new DefaultPhysicDataSource(_shardingConfigOption.DefaultDataSourceName, _shardingConfigOption.DefaultConnectionString, true));
|
_virtualDataSource.AddPhysicDataSource(new DefaultPhysicDataSource(_shardingConfigOption.DefaultDataSourceName, _shardingConfigOption.DefaultConnectionString, true));
|
||||||
InitializeEntityMetadata();
|
InitializeEntityMetadata();
|
||||||
InitializeConfigure();
|
InitializeConfigure();
|
||||||
|
_virtualDataSource.CheckVirtualDataSource();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeEntityMetadata()
|
private void InitializeEntityMetadata()
|
||||||
|
|
|
@ -46,6 +46,12 @@ namespace ShardingCore.Core.VirtualDatabase.VirtualDataSources
|
||||||
/// </exception>
|
/// </exception>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
IPhysicDataSource GetPhysicDataSource(string dataSourceName);
|
IPhysicDataSource GetPhysicDataSource(string dataSourceName);
|
||||||
|
/// <summary>
|
||||||
|
/// 获取数据库链接字符串
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dataSourceName"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
string GetConnectionString(string dataSourceName);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加物理表 add physic data source
|
/// 添加物理表 add physic data source
|
||||||
|
@ -56,6 +62,10 @@ namespace ShardingCore.Core.VirtualDatabase.VirtualDataSources
|
||||||
|
|
||||||
bool AddVirtualDataSourceRoute(IVirtualDataSourceRoute virtualDataSourceRoute);
|
bool AddVirtualDataSourceRoute(IVirtualDataSourceRoute virtualDataSourceRoute);
|
||||||
bool IsDefault(string dataSourceName);
|
bool IsDefault(string dataSourceName);
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化检查数据源
|
||||||
|
/// </summary>
|
||||||
|
void CheckVirtualDataSource();
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 虚拟数据源 连接所有的实际数据源
|
/// 虚拟数据源 连接所有的实际数据源
|
||||||
|
|
|
@ -32,6 +32,7 @@ namespace ShardingCore.Core.VirtualDatabase.VirtualDataSources
|
||||||
new ConcurrentDictionary<string, IPhysicDataSource>();
|
new ConcurrentDictionary<string, IPhysicDataSource>();
|
||||||
|
|
||||||
public string DefaultDataSourceName { get; private set; }
|
public string DefaultDataSourceName { get; private set; }
|
||||||
|
public string DefaultConnectionString { get; private set; }
|
||||||
|
|
||||||
public VirtualDataSource(IEntityMetadataManager<TShardingDbContext> entityMetadataManager)
|
public VirtualDataSource(IEntityMetadataManager<TShardingDbContext> entityMetadataManager)
|
||||||
{
|
{
|
||||||
|
@ -101,6 +102,13 @@ namespace ShardingCore.Core.VirtualDatabase.VirtualDataSources
|
||||||
return physicDataSource;
|
return physicDataSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string GetConnectionString(string dataSourceName)
|
||||||
|
{
|
||||||
|
if (IsDefault(dataSourceName))
|
||||||
|
return DefaultConnectionString;
|
||||||
|
return GetPhysicDataSource(DefaultDataSourceName).ConnectionString;
|
||||||
|
}
|
||||||
|
|
||||||
public bool AddPhysicDataSource(IPhysicDataSource physicDataSource)
|
public bool AddPhysicDataSource(IPhysicDataSource physicDataSource)
|
||||||
{
|
{
|
||||||
if (physicDataSource.IsDefault)
|
if (physicDataSource.IsDefault)
|
||||||
|
@ -109,8 +117,8 @@ namespace ShardingCore.Core.VirtualDatabase.VirtualDataSources
|
||||||
{
|
{
|
||||||
throw new ShardingCoreInvalidOperationException($"default data source name:[{DefaultDataSourceName}],add physic default data source name:[{physicDataSource.DataSourceName}]");
|
throw new ShardingCoreInvalidOperationException($"default data source name:[{DefaultDataSourceName}],add physic default data source name:[{physicDataSource.DataSourceName}]");
|
||||||
}
|
}
|
||||||
|
|
||||||
DefaultDataSourceName = physicDataSource.DataSourceName;
|
DefaultDataSourceName = physicDataSource.DataSourceName;
|
||||||
|
DefaultConnectionString = physicDataSource.ConnectionString;
|
||||||
}
|
}
|
||||||
return _physicDataSources.TryAdd(physicDataSource.DataSourceName, physicDataSource);
|
return _physicDataSources.TryAdd(physicDataSource.DataSourceName, physicDataSource);
|
||||||
}
|
}
|
||||||
|
@ -125,12 +133,19 @@ namespace ShardingCore.Core.VirtualDatabase.VirtualDataSources
|
||||||
|
|
||||||
public bool IsDefault(string dataSourceName)
|
public bool IsDefault(string dataSourceName)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(DefaultDataSourceName))
|
|
||||||
{
|
return DefaultDataSourceName == dataSourceName;
|
||||||
throw new ShardingCoreInvalidOperationException("virtual data source not inited");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return DefaultDataSourceName== dataSourceName;
|
public void CheckVirtualDataSource()
|
||||||
|
{
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(DefaultDataSourceName))
|
||||||
|
throw new ShardingCoreInvalidOperationException(
|
||||||
|
$"virtual data source not inited {nameof(DefaultDataSourceName)} in IShardingDbContext null");
|
||||||
|
if (string.IsNullOrWhiteSpace(DefaultConnectionString))
|
||||||
|
throw new ShardingCoreInvalidOperationException(
|
||||||
|
$"virtual data source not inited {nameof(DefaultConnectionString)} in IShardingDbContext null");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -23,7 +23,7 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions
|
||||||
//获取路由后缀表达式
|
//获取路由后缀表达式
|
||||||
var routeParseExpression = ShardingUtil.GetRouteParseExpression<TKey>(queryable, EntityMetadata, GetRouteToFilter,true);
|
var routeParseExpression = ShardingUtil.GetRouteParseExpression<TKey>(queryable, EntityMetadata, GetRouteToFilter,true);
|
||||||
//表达式缓存编译
|
//表达式缓存编译
|
||||||
var filter=CachingCompile(routeParseExpression);
|
var filter =CachingCompile(routeParseExpression);
|
||||||
//通过编译结果进行过滤
|
//通过编译结果进行过滤
|
||||||
var physicTables = allPhysicTables.Where(o => filter(o.Tail)).ToList();
|
var physicTables = allPhysicTables.Where(o => filter(o.Tail)).ToList();
|
||||||
return physicTables;
|
return physicTables;
|
||||||
|
|
|
@ -21,13 +21,6 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static Func<string, bool> FromCache(this Expression<Func<string,bool>> query)
|
public static Func<string, bool> FromCache(this Expression<Func<string,bool>> query)
|
||||||
{
|
{
|
||||||
var startNew = Stopwatch.StartNew();
|
|
||||||
for (int i = 0; i < 300; i++)
|
|
||||||
{
|
|
||||||
string key1 = query.GetCacheKey();
|
|
||||||
}
|
|
||||||
startNew.Stop();
|
|
||||||
var x = startNew.ElapsedMilliseconds;
|
|
||||||
string key = query.GetCacheKey();
|
string key = query.GetCacheKey();
|
||||||
|
|
||||||
return _routeFilter.GetOrAdd(key, k => query.Compile());
|
return _routeFilter.GetOrAdd(key, k => query.Compile());
|
||||||
|
|
|
@ -60,7 +60,7 @@ namespace ShardingCore.Sharding
|
||||||
}
|
}
|
||||||
private string GetWriteConnectionString(string dataSourceName)
|
private string GetWriteConnectionString(string dataSourceName)
|
||||||
{
|
{
|
||||||
return _virtualDataSource.GetPhysicDataSource(dataSourceName).ConnectionString;
|
return _virtualDataSource.GetConnectionString(dataSourceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetReadWriteSeparationConnectString(string dataSourceName)
|
private string GetReadWriteSeparationConnectString(string dataSourceName)
|
||||||
|
|
|
@ -21,7 +21,7 @@ namespace ShardingCore.Sharding
|
||||||
}
|
}
|
||||||
public string GetConnectionString(string dataSourceName)
|
public string GetConnectionString(string dataSourceName)
|
||||||
{
|
{
|
||||||
return _virtualDataSource.GetPhysicDataSource(dataSourceName).ConnectionString;
|
return _virtualDataSource.GetConnectionString(dataSourceName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ namespace ShardingCore.Sharding.MergeEngines.Abstractions.InMemoryMerge.Abstract
|
||||||
{
|
{
|
||||||
if (secondExpression is UnaryExpression where)
|
if (secondExpression is UnaryExpression where)
|
||||||
{
|
{
|
||||||
if (where.Operand is LambdaExpression lambdaExpression && lambdaExpression is Expression<Func<TEntity, bool>> predicate)
|
if (@where.Operand is LambdaExpression lambdaExpression and Expression<Func<TEntity, bool>> predicate)
|
||||||
{
|
{
|
||||||
return queryable.Where(predicate);
|
return queryable.Where(predicate);
|
||||||
}
|
}
|
||||||
|
|
|
@ -166,6 +166,8 @@ namespace ShardingCore.Sharding.ShardingQueryExecutors
|
||||||
private TResult GenericShardingDbContextMergeExecute<TResult>(Type streamMergeEngineType, IShardingDbContext shardingDbContext, MethodCallExpression query, bool async, CancellationToken cancellationToken)
|
private TResult GenericShardingDbContextMergeExecute<TResult>(Type streamMergeEngineType, IShardingDbContext shardingDbContext, MethodCallExpression query, bool async, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
//{
|
//{
|
||||||
|
|
||||||
|
// var startNew1 = Stopwatch.StartNew();
|
||||||
// var queryEntityType = query.GetQueryEntityType();
|
// var queryEntityType = query.GetQueryEntityType();
|
||||||
// var newStreamMergeEngineType = streamMergeEngineType.MakeGenericType(shardingDbContext.GetType(), queryEntityType);
|
// var newStreamMergeEngineType = streamMergeEngineType.MakeGenericType(shardingDbContext.GetType(), queryEntityType);
|
||||||
|
|
||||||
|
@ -181,21 +183,19 @@ namespace ShardingCore.Sharding.ShardingQueryExecutors
|
||||||
// // var x = startNew.ElapsedMilliseconds;
|
// // var x = startNew.ElapsedMilliseconds;
|
||||||
// //}
|
// //}
|
||||||
// {
|
// {
|
||||||
|
// for (int i = 0; i < 10; i++)
|
||||||
// //获取所有需要路由的表后缀
|
|
||||||
// var startNew1 = Stopwatch.StartNew();
|
|
||||||
// for (int i = 0; i < 1; i++)
|
|
||||||
// {
|
// {
|
||||||
// var streamEngine = Activator.CreateInstance(typeof(AAA), shardingDbContext, query);
|
// var streamEngine = Activator.CreateInstance(typeof(AAA), shardingDbContext, query);
|
||||||
// }
|
// }
|
||||||
// startNew1.Stop();
|
|
||||||
// var x = startNew1.ElapsedMilliseconds;
|
|
||||||
// }
|
// }
|
||||||
// var methodName = async ? nameof(IGenericMergeResult.MergeResultAsync) : nameof(IGenericMergeResult.MergeResult);
|
// var methodName = async ? nameof(IGenericMergeResult.MergeResultAsync) : nameof(IGenericMergeResult.MergeResult);
|
||||||
// var streamEngineMethod = newStreamMergeEngineType.GetMethod(methodName);
|
// var streamEngineMethod = newStreamMergeEngineType.GetMethod(methodName);
|
||||||
// if (streamEngineMethod == null)
|
// if (streamEngineMethod == null)
|
||||||
// throw new ShardingCoreException($"cant found InMemoryAsyncStreamMergeEngine method [{methodName}]");
|
// throw new ShardingCoreException($"cant found InMemoryAsyncStreamMergeEngine method [{methodName}]");
|
||||||
// var @params = async ? new object[] { cancellationToken } : new object[0];
|
// var @params = async ? new object[] { cancellationToken } : new object[0];
|
||||||
|
// startNew1.Stop();
|
||||||
|
// var x = startNew1.ElapsedMilliseconds;
|
||||||
|
// Console.WriteLine("----------------------"+x);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
|
@ -94,7 +94,9 @@ namespace ShardingCore.Core.Internal.Visitors
|
||||||
private TKey GetShardingKeyValue(Expression expression)
|
private TKey GetShardingKeyValue(Expression expression)
|
||||||
{
|
{
|
||||||
if (expression is ConstantExpression constantExpression)
|
if (expression is ConstantExpression constantExpression)
|
||||||
|
{
|
||||||
return (TKey)constantExpression.Value;
|
return (TKey)constantExpression.Value;
|
||||||
|
}
|
||||||
if (expression is UnaryExpression unaryExpression)
|
if (expression is UnaryExpression unaryExpression)
|
||||||
{
|
{
|
||||||
return Expression.Lambda<Func<TKey>>(unaryExpression.Operand).Compile()();
|
return Expression.Lambda<Func<TKey>>(unaryExpression.Operand).Compile()();
|
||||||
|
@ -102,11 +104,24 @@ namespace ShardingCore.Core.Internal.Visitors
|
||||||
|
|
||||||
if (expression is MemberExpression member1Expression)
|
if (expression is MemberExpression member1Expression)
|
||||||
{
|
{
|
||||||
//var target = GetShardingKeyValue(member1Expression.Expression);
|
|
||||||
//if (member1Expression.Member is FieldInfo field)
|
if (member1Expression.Expression is ConstantExpression memberConstantExpression)
|
||||||
// return field.GetValue(target);
|
{
|
||||||
//if (member1Expression.Member is PropertyInfo property)
|
if (member1Expression.Member is FieldInfo memberFieldInfo)
|
||||||
// return property.GetValue(target);
|
{
|
||||||
|
object container = memberConstantExpression.Value;
|
||||||
|
return (TKey)memberFieldInfo.GetValue(container);
|
||||||
|
}
|
||||||
|
if (member1Expression.Member is PropertyInfo memberPropertyInfo)
|
||||||
|
{
|
||||||
|
object container = memberConstantExpression.Value;
|
||||||
|
return (TKey)memberPropertyInfo.GetValue(container);
|
||||||
|
}
|
||||||
|
else if (memberConstantExpression.Value is TKey shardingKeyValue)
|
||||||
|
{
|
||||||
|
return shardingKeyValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
return Expression.Lambda<Func<TKey>>(member1Expression).Compile()();
|
return Expression.Lambda<Func<TKey>>(member1Expression).Compile()();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -445,7 +445,15 @@ namespace ShardingCore.Test
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task FirstOrDefault2()
|
public async Task FirstOrDefault2()
|
||||||
{
|
{
|
||||||
var sysUserModabxxxxx = await _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth>=202102).FirstOrDefaultAsync();
|
var sysUserModabxxxxx1 = await _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102).FirstOrDefaultAsync();
|
||||||
|
var sysUserModabxxxxx2 = await _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101).FirstOrDefaultAsync();
|
||||||
|
var sysUserModabxxxxx3 = await _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202102).FirstOrDefaultAsync();
|
||||||
|
var sysUserModabxxxxx4 = await _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202102).FirstOrDefaultAsync();
|
||||||
|
var sysUserModabxxxxx5 = await _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth < 202102).FirstOrDefaultAsync();
|
||||||
|
var sysUserModabxxxxx6 = await _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth <= 202102).FirstOrDefaultAsync();
|
||||||
|
var sysUserModabxxxxx7 = await _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102).FirstOrDefaultAsync();
|
||||||
|
var next = "1";
|
||||||
|
var sysUserMod1 = await _virtualDbContext.Set<SysUserMod>().Where(o => o.Id == next).FirstOrDefaultAsync();
|
||||||
var sysUserModabxxx = await _virtualDbContext.Set<SysUserMod>().Where(o => o.Name == "name_2").FirstOrDefaultAsync();
|
var sysUserModabxxx = await _virtualDbContext.Set<SysUserMod>().Where(o => o.Name == "name_2").FirstOrDefaultAsync();
|
||||||
var sysUserModabxxx11 = await _virtualDbContext.Set<SysUserMod>().Where(o => o.Name == "name_2"|| o.Name == "name_3").FirstOrDefaultAsync();
|
var sysUserModabxxx11 = await _virtualDbContext.Set<SysUserMod>().Where(o => o.Name == "name_2"|| o.Name == "name_3").FirstOrDefaultAsync();
|
||||||
var x=new Object [] { "1", "2" };
|
var x=new Object [] { "1", "2" };
|
||||||
|
|
Loading…
Reference in New Issue