2021-09-08 10:44:29 +08:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using EFCore.BulkExtensions;
|
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
using Sample.BulkConsole.DbContexts;
|
|
|
|
|
using Sample.BulkConsole.Entities;
|
|
|
|
|
using ShardingCore;
|
|
|
|
|
using ShardingCore.Extensions;
|
|
|
|
|
|
|
|
|
|
namespace Sample.BulkConsole
|
|
|
|
|
{
|
|
|
|
|
class Program
|
|
|
|
|
{
|
|
|
|
|
public static readonly ILoggerFactory efLogger = LoggerFactory.Create(builder =>
|
|
|
|
|
{
|
|
|
|
|
builder.AddFilter((category, level) => category == DbLoggerCategory.Database.Command.Name && level == LogLevel.Information).AddConsole();
|
|
|
|
|
});
|
|
|
|
|
static void Main(string[] args)
|
|
|
|
|
{
|
|
|
|
|
var services = new ServiceCollection();
|
|
|
|
|
services.AddLogging();
|
|
|
|
|
services.AddShardingDbContext<MyShardingDbContext, MyDbContext>(
|
2021-09-20 22:26:48 +08:00
|
|
|
|
o => o.UseSqlServer("Data Source=localhost;Initial Catalog=MyOrderSharding;Integrated Security=True;"))
|
2021-09-21 11:33:41 +08:00
|
|
|
|
.Begin(true,true)
|
2021-09-20 22:26:48 +08:00
|
|
|
|
.AddShardingQuery((conStr, builder) => builder.UseSqlServer(conStr).UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking))
|
|
|
|
|
.AddShardingTransaction((connection, builder) => builder.UseSqlServer(connection))
|
|
|
|
|
.AddDefaultDataSource("ds0", "Data Source=localhost;Initial Catalog=MyOrderSharding;Integrated Security=True;")
|
|
|
|
|
.AddShardingTable(op=> {
|
2021-09-08 10:44:29 +08:00
|
|
|
|
op.AddShardingTableRoute<OrderVirtualRoute>();
|
2021-09-20 22:26:48 +08:00
|
|
|
|
}).End();
|
2021-09-08 10:44:29 +08:00
|
|
|
|
var serviceProvider = services.BuildServiceProvider();
|
|
|
|
|
serviceProvider.GetService<IShardingBootstrapper>().Start();
|
|
|
|
|
using (var serviceScope = serviceProvider.CreateScope())
|
|
|
|
|
{
|
|
|
|
|
var myShardingDbContext = serviceScope.ServiceProvider.GetService<MyShardingDbContext>();
|
|
|
|
|
if (!myShardingDbContext.Set<Order>().Any())
|
|
|
|
|
{
|
|
|
|
|
var begin = DateTime.Now.Date.AddDays(-3);
|
|
|
|
|
var now = DateTime.Now;
|
|
|
|
|
var current = begin;
|
|
|
|
|
ICollection<Order> orders = new LinkedList<Order>();
|
|
|
|
|
int i = 0;
|
|
|
|
|
while (current < now)
|
|
|
|
|
{
|
|
|
|
|
orders.Add(new Order()
|
|
|
|
|
{
|
|
|
|
|
Id = i.ToString(),
|
|
|
|
|
OrderNo = $"orderno-" + i.ToString(),
|
|
|
|
|
Seq = i,
|
|
|
|
|
CreateTime = current
|
|
|
|
|
});
|
|
|
|
|
i++;
|
|
|
|
|
current = current.AddMilliseconds(100);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var startNew = Stopwatch.StartNew();
|
|
|
|
|
var bulkShardingEnumerable = myShardingDbContext.BulkShardingEnumerable(orders);
|
|
|
|
|
startNew.Stop();
|
|
|
|
|
Console.WriteLine($"订单总数:{i}条,myShardingDbContext.BulkShardingEnumerable(orders)用时:{startNew.ElapsedMilliseconds}毫秒");
|
|
|
|
|
startNew.Restart();
|
|
|
|
|
foreach (var keyValuePair in bulkShardingEnumerable)
|
|
|
|
|
{
|
2021-09-21 11:33:41 +08:00
|
|
|
|
foreach (var valuePair in keyValuePair.Value)
|
|
|
|
|
{
|
|
|
|
|
valuePair.Key.BulkInsert(valuePair.Value.ToList());
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-08 10:44:29 +08:00
|
|
|
|
}
|
|
|
|
|
startNew.Stop();
|
|
|
|
|
Console.WriteLine($"订单总数:{i}条,myShardingDbContext.BulkInsert(orders)用时:{startNew.ElapsedMilliseconds}毫秒");
|
|
|
|
|
|
|
|
|
|
Console.WriteLine("ok");
|
|
|
|
|
}
|
2021-09-17 13:16:52 +08:00
|
|
|
|
|
2021-09-15 16:50:00 +08:00
|
|
|
|
var b = DateTime.Now.Date.AddDays(-3);
|
2021-09-08 10:44:29 +08:00
|
|
|
|
var queryable = myShardingDbContext.Set<Order>().Where(o => o.CreateTime >= b).OrderBy(o => o.CreateTime);
|
|
|
|
|
var startNew1 = Stopwatch.StartNew();
|
|
|
|
|
|
|
|
|
|
int skip = 0, take = 10;
|
2021-09-15 16:50:00 +08:00
|
|
|
|
for (int i = 1000; i < 20000; i++)
|
2021-09-08 10:44:29 +08:00
|
|
|
|
{
|
|
|
|
|
skip = take * i;
|
|
|
|
|
startNew1.Restart();
|
|
|
|
|
var shardingPagedResult = queryable.ToShardingPage(i+1, take);
|
|
|
|
|
startNew1.Stop();
|
|
|
|
|
Console.WriteLine($"流式分页skip:[{skip}],take:[{take}]耗时用时:{startNew1.ElapsedMilliseconds}毫秒");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Console.WriteLine("ok");
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|