Skip to content

Commit da4675d

Browse files
committed
添加启动时未分表dbcontext检查,添加动态读写分离库支持,发布x.3.1.66
1 parent 48deab9 commit da4675d

File tree

21 files changed

+571
-297
lines changed

21 files changed

+571
-297
lines changed

benchmarks/ShardingCoreBenchmark/EFCoreCrud.cs

Lines changed: 167 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313
using ShardingCore.Bootstrapers;
1414
using ShardingCore.Core.VirtualDatabase.VirtualDataSources;
1515
using ShardingCore.Core.VirtualDatabase.VirtualTables;
16+
using ShardingCore.Core.VirtualRoutes.DataSourceRoutes.RouteRuleEngine;
1617
using ShardingCore.Core.VirtualRoutes.TableRoutes;
1718
using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions;
19+
using ShardingCore.Core.VirtualRoutes.TableRoutes.RoutingRuleEngine;
1820
using ShardingCore.Core.VirtualTables;
1921
using ShardingCore.Exceptions;
2022
using ShardingCore.Extensions;
@@ -37,6 +39,8 @@ public class EFCoreCrud
3739
private readonly IStreamMergeContextFactory<DefaultShardingDbContext> _streamMergeContextFactory;
3840
private readonly ActualConnectionStringManager<DefaultShardingDbContext> _actualConnectionStringManager;
3941
private readonly IVirtualDataSource<DefaultShardingDbContext> _virtualDataSource;
42+
private readonly IDataSourceRouteRuleEngineFactory<DefaultShardingDbContext> _dataSourceRouteRuleEngineFactory;
43+
private readonly ITableRouteRuleEngineFactory<DefaultShardingDbContext> _tableRouteRuleEngineFactory;
4044
public EFCoreCrud()
4145
{
4246
var services = new ServiceCollection();
@@ -119,6 +123,8 @@ public EFCoreCrud()
119123
ShardingContainer.GetService<IStreamMergeContextFactory<DefaultShardingDbContext>>();
120124
_actualConnectionStringManager = new ActualConnectionStringManager<DefaultShardingDbContext>();
121125
_virtualDataSource = ShardingContainer.GetService<IVirtualDataSource<DefaultShardingDbContext>>();
126+
_dataSourceRouteRuleEngineFactory = ShardingContainer.GetService<IDataSourceRouteRuleEngineFactory<DefaultShardingDbContext>>();
127+
_tableRouteRuleEngineFactory = ShardingContainer.GetService<ITableRouteRuleEngineFactory<DefaultShardingDbContext>>();
122128

123129
}
124130

@@ -146,16 +152,45 @@ public EFCoreCrud()
146152
// var connectionString = _actualConnectionStringManager.GetConnectionString("ds0", false);
147153
// }
148154
//}
149-
//[Benchmark]
150-
//public async Task ShardingCreateStreamMergeContext()
151-
//{
152-
// for (int i = 0; i < N; i++)
153-
// {
154-
// var next = new Random().Next(1000000, 3000000).ToString();
155-
// var queryable = _defaultShardingDbContext.Set<Order>().Where(o => o.Id == next);
156-
// var firstOrDefaultAsync = _streamMergeContextFactory.Create(queryable, _defaultShardingDbContext);
157-
// }
158-
//}
155+
[Benchmark]
156+
public async Task CreateQueryable()
157+
{
158+
for (int i = 0; i < N; i++)
159+
{
160+
var next = new Random().Next(1000000, 3000000).ToString();
161+
var queryable = _defaultShardingDbContext.Set<Order>().Where(o => o.Id == next);
162+
}
163+
}
164+
[Benchmark]
165+
public async Task DataSourceRouteRuleEngineFactory()
166+
{
167+
for (int i = 0; i < N; i++)
168+
{
169+
var next = new Random().Next(1000000, 3000000).ToString();
170+
var queryable = _defaultShardingDbContext.Set<Order>().Where(o => o.Id == next);
171+
_dataSourceRouteRuleEngineFactory.Route(queryable);
172+
}
173+
}
174+
[Benchmark]
175+
public async Task TableRouteRuleEngineFactory()
176+
{
177+
for (int i = 0; i < N; i++)
178+
{
179+
var next = new Random().Next(1000000, 3000000).ToString();
180+
var queryable = _defaultShardingDbContext.Set<Order>().Where(o => o.Id == next);
181+
_tableRouteRuleEngineFactory.Route(queryable);
182+
}
183+
}
184+
[Benchmark]
185+
public async Task ShardingCreateStreamMergeContext()
186+
{
187+
for (int i = 0; i < N; i++)
188+
{
189+
var next = new Random().Next(1000000, 3000000).ToString();
190+
var queryable = _defaultShardingDbContext.Set<Order>().Where(o => o.Id == next);
191+
var firstOrDefaultAsync = _streamMergeContextFactory.Create(queryable, _defaultShardingDbContext);
192+
}
193+
}
159194
//[Benchmark]
160195
//public async Task NoRouteParseCache()
161196
//{
@@ -178,24 +213,24 @@ public EFCoreCrud()
178213
// _virtualTable.RouteTo(new ShardingTableRouteConfig(queryable: queryable1));
179214
// }
180215
//}
181-
[Benchmark]
182-
public async Task NoShardingFirstOrDefaultAsync()
183-
{
184-
for (int i = 0; i < N; i++)
185-
{
186-
var next = new Random().Next(1, 7000000).ToString();
187-
var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Id == next);
188-
}
189-
}
190-
[Benchmark]
191-
public async Task ShardingFirstOrDefaultAsync()
192-
{
193-
for (int i = 0; i < N; i++)
194-
{
195-
var next = new Random().Next(1, 7000000).ToString();
196-
var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Id == next);
197-
}
198-
}
216+
//[Benchmark]
217+
//public async Task NoShardingFirstOrDefaultAsync()
218+
//{
219+
// for (int i = 0; i < N; i++)
220+
// {
221+
// var next = new Random().Next(1, 7000000).ToString();
222+
// var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Id == next);
223+
// }
224+
//}
225+
//[Benchmark]
226+
//public async Task ShardingFirstOrDefaultAsync()
227+
//{
228+
// for (int i = 0; i < N; i++)
229+
// {
230+
// var next = new Random().Next(1, 7000000).ToString();
231+
// var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Id == next);
232+
// }
233+
//}
199234
//[Benchmark]
200235
//public async Task NoShardingIndexFirstOrDefaultAsync()
201236
//{
@@ -216,120 +251,120 @@ public async Task ShardingFirstOrDefaultAsync()
216251
// var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Id == next);
217252
// }
218253
//}
219-
[Benchmark]
220-
public async Task NoShardingNoIndexFirstOrDefaultAsync()
221-
{
222-
for (int i = 0; i < N; i++)
223-
{
224-
var firstOrDefaultAsync1 = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 0);
225-
var firstOrDefaultAsync2 = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 999999);
226-
}
227-
}
254+
//[Benchmark]
255+
//public async Task NoShardingNoIndexFirstOrDefaultAsync()
256+
//{
257+
// for (int i = 0; i < N; i++)
258+
// {
259+
// var firstOrDefaultAsync1 = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 0);
260+
// var firstOrDefaultAsync2 = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 999999);
261+
// }
262+
//}
228263

229264

230-
[Benchmark]
231-
public async Task ShardingNoIndexFirstOrDefaultAsync()
232-
{
233-
for (int i = 0; i < N; i++)
234-
{
235-
var firstOrDefaultAsync1 = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 0);
236-
var firstOrDefaultAsync2 = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 999999);
237-
}
238-
}
239-
[Benchmark]
240-
public async Task NoShardingNoIndexCountAsync()
241-
{
242-
for (int i = 0; i < N; i++)
243-
{
244-
var firstOrDefaultAsync1 = await _defaultDbContext.Set<Order>().CountAsync(o => o.Amount == 0);
245-
var firstOrDefaultAsync2 = await _defaultDbContext.Set<Order>().CountAsync(o => o.Amount == 999999);
246-
}
247-
}
265+
//[Benchmark]
266+
//public async Task ShardingNoIndexFirstOrDefaultAsync()
267+
//{
268+
// for (int i = 0; i < N; i++)
269+
// {
270+
// var firstOrDefaultAsync1 = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 0);
271+
// var firstOrDefaultAsync2 = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 999999);
272+
// }
273+
//}
274+
//[Benchmark]
275+
//public async Task NoShardingNoIndexCountAsync()
276+
//{
277+
// for (int i = 0; i < N; i++)
278+
// {
279+
// var firstOrDefaultAsync1 = await _defaultDbContext.Set<Order>().CountAsync(o => o.Amount == 0);
280+
// var firstOrDefaultAsync2 = await _defaultDbContext.Set<Order>().CountAsync(o => o.Amount == 999999);
281+
// }
282+
//}
248283

249284

250-
[Benchmark]
251-
public async Task ShardingNoIndexCountAsync()
252-
{
253-
for (int i = 0; i < N; i++)
254-
{
255-
var firstOrDefaultAsync1 = await _defaultShardingDbContext.Set<Order>().CountAsync(o => o.Amount == 0);
256-
var firstOrDefaultAsync2 = await _defaultShardingDbContext.Set<Order>().CountAsync(o => o.Amount == 999999);
257-
}
258-
}
259-
[Benchmark]
260-
public async Task NoShardingNoIndexFirstOrDefaultAsync0w()
261-
{
262-
for (int i = 0; i < N; i++)
263-
{
264-
var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 0);
265-
}
266-
}
267-
[Benchmark]
268-
public async Task ShardingNoIndexFirstOrDefaultAsync0w()
269-
{
270-
for (int i = 0; i < N; i++)
271-
{
272-
var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 0);
273-
}
274-
}
275-
[Benchmark]
276-
public async Task NoShardingNoIndexFirstOrDefaultAsync99w()
277-
{
278-
for (int i = 0; i < N; i++)
279-
{
280-
var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 999999);
281-
}
282-
}
283-
[Benchmark]
284-
public async Task ShardingNoIndexFirstOrDefaultAsync99w()
285-
{
286-
for (int i = 0; i < N; i++)
287-
{
288-
var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 999999);
289-
}
290-
}
285+
//[Benchmark]
286+
//public async Task ShardingNoIndexCountAsync()
287+
//{
288+
// for (int i = 0; i < N; i++)
289+
// {
290+
// var firstOrDefaultAsync1 = await _defaultShardingDbContext.Set<Order>().CountAsync(o => o.Amount == 0);
291+
// var firstOrDefaultAsync2 = await _defaultShardingDbContext.Set<Order>().CountAsync(o => o.Amount == 999999);
292+
// }
293+
//}
294+
//[Benchmark]
295+
//public async Task NoShardingNoIndexFirstOrDefaultAsync0w()
296+
//{
297+
// for (int i = 0; i < N; i++)
298+
// {
299+
// var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 0);
300+
// }
301+
//}
302+
//[Benchmark]
303+
//public async Task ShardingNoIndexFirstOrDefaultAsync0w()
304+
//{
305+
// for (int i = 0; i < N; i++)
306+
// {
307+
// var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 0);
308+
// }
309+
//}
310+
//[Benchmark]
311+
//public async Task NoShardingNoIndexFirstOrDefaultAsync99w()
312+
//{
313+
// for (int i = 0; i < N; i++)
314+
// {
315+
// var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 999999);
316+
// }
317+
//}
318+
//[Benchmark]
319+
//public async Task ShardingNoIndexFirstOrDefaultAsync99w()
320+
//{
321+
// for (int i = 0; i < N; i++)
322+
// {
323+
// var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Amount == 999999);
324+
// }
325+
//}
291326

292327

293-
[Benchmark]
294-
public async Task NoShardingNoIndexLikeToListAsync()
295-
{
296-
for (int i = 0; i < N; i++)
297-
{
298-
var next = new Random().Next(1, 7000000).ToString();
299-
var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().Where(o => o.Body.Contains(next)).ToListAsync();
300-
}
301-
}
328+
//[Benchmark]
329+
//public async Task NoShardingNoIndexLikeToListAsync()
330+
//{
331+
// for (int i = 0; i < N; i++)
332+
// {
333+
// var next = new Random().Next(1, 7000000).ToString();
334+
// var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().Where(o => o.Body.Contains(next)).ToListAsync();
335+
// }
336+
//}
302337

303338

304-
[Benchmark]
305-
public async Task ShardingNoIndexLikeToListAsync()
306-
{
307-
for (int i = 0; i < N; i++)
308-
{
309-
var next = new Random().Next(1, 7000000).ToString();
310-
var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().Where(o => o.Body.Contains(next)).ToListAsync();
311-
}
312-
}
313-
[Benchmark]
314-
public async Task NoShardingNoIndexToListAsync()
315-
{
316-
for (int i = 0; i < N; i++)
317-
{
318-
var next = new Random().Next(1, 7000000);
319-
var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().Where(o => o.Amount == next).ToListAsync();
320-
}
321-
}
339+
//[Benchmark]
340+
//public async Task ShardingNoIndexLikeToListAsync()
341+
//{
342+
// for (int i = 0; i < N; i++)
343+
// {
344+
// var next = new Random().Next(1, 7000000).ToString();
345+
// var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().Where(o => o.Body.Contains(next)).ToListAsync();
346+
// }
347+
//}
348+
//[Benchmark]
349+
//public async Task NoShardingNoIndexToListAsync()
350+
//{
351+
// for (int i = 0; i < N; i++)
352+
// {
353+
// var next = new Random().Next(1, 7000000);
354+
// var firstOrDefaultAsync = await _defaultDbContext.Set<Order>().Where(o => o.Amount == next).ToListAsync();
355+
// }
356+
//}
322357

323358

324-
[Benchmark]
325-
public async Task ShardingNoIndexToListAsync()
326-
{
327-
for (int i = 0; i < N; i++)
328-
{
329-
var next = new Random().Next(1, 7000000);
330-
var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().Where(o => o.Amount == next).ToListAsync();
331-
}
332-
}
359+
//[Benchmark]
360+
//public async Task ShardingNoIndexToListAsync()
361+
//{
362+
// for (int i = 0; i < N; i++)
363+
// {
364+
// var next = new Random().Next(1, 7000000);
365+
// var firstOrDefaultAsync = await _defaultShardingDbContext.Set<Order>().Where(o => o.Amount == next).ToListAsync();
366+
// }
367+
//}
333368
//[Benchmark]
334369
//public void ShardingRouteFirstOrDefault()
335370
//{

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.65
4-
set EFCORE3=3.3.1.65
5-
set EFCORE5=5.3.1.65
6-
set EFCORE6=6.3.1.65
3+
set EFCORE2=2.3.1.66
4+
set EFCORE3=3.3.1.66
5+
set EFCORE5=5.3.1.66
6+
set EFCORE6=6.3.1.66
77

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

samples/Sample.SqlServerShardingDataSource/Controllers/TestController.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ public TestController(MyDbContext myDbContext)
1717
{
1818
_myDbContext = myDbContext;
1919
}
20+
/// <summary>
21+
/// 动态追加分库
22+
/// </summary>
23+
/// <returns></returns>
24+
//public IActionResult Queryabc()
25+
//{
26+
// DbContextHelper.CreateSubDb("X", "Data Source=localhost;Initial Catalog=EFCoreShardingDataSourceDBX;Integrated Security=True;");
27+
// return Ok();
28+
//}
2029
public async Task<IActionResult> Query()
2130
{
2231
var sysUser =await _myDbContext.Set<SysUser>().Where(o=>o.Id=="1").FirstOrDefaultAsync();

0 commit comments

Comments
 (0)