ShardingCore批量插入

Posted W~C停用

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ShardingCore批量插入相关的知识,希望对你有一定的参考价值。

 public async Task Test()
        {
            List<Industrial> list = new List<Industrial>();

            for (int i = 0; i < 10000; i++)
            {
                list.Add(new Industrial()
                {
                    PrimaryKey = Guid.NewGuid(),
                    YearStr = "2021",
                    UpdateTime = DateTime.Now.AddYears(-1)
                }); ;
            }
            _or public async Task Test()
        {
            List<Industrial> list = new List<Industrial>();

            for (int i = 0; i < 10000; i++)
            {
                list.Add(new Industrial()
                {
                    PrimaryKey = Guid.NewGuid(),
                    YearStr = "2021",
                    UpdateTime = DateTime.Now.AddYears(-1)
                }); ;
            }
            _orclContext.Database.EnsureCreated();
            _logger.LogInformation($"Oracle连接{_orclContext.Database.CanConnect()}");
            _logger.LogInformation($"生成对象完成{list.Count}");
            var bulkShardingEnumerable = _orclContext.BulkShardingTableEnumerable(list);

            foreach (var dataSourceMap in bulkShardingEnumerable)
            {
                dataSourceMap.Key.BulkInsert(dataSourceMap.Value.ToList());
            }
            _logger.LogInformation("插入成功");
        }clContext.Database.EnsureCreated();
            _logger.LogInformation($"Oracle连接{_orclContext.Database.CanConnect()}");
            _logger.LogInformation($"生成对象完成{list.Count}");
            var bulkShardingEnumerable = _orclContext.BulkShardingTableEnumerable(list);

            foreach (var dataSourceMap in bulkShardingEnumerable)
            {
                dataSourceMap.Key.BulkInsert(dataSourceMap.Value.ToList());
            }
            _logger.LogInformation("插入成功");
        }

 

ShardingCore 7.0 版本发布

NCC ShardingCore 是一款 EntityFramework Core based 高性能、轻量级、分表分库、读写分离解决方案,具有零依赖、零学习成本、零业务代码入侵等特点。ShardingCore 7.0 已于近期发布。

从 ShardingCore 7.0 开始,启用版本号第二位来对应不同的 EFCore  版本,如 7.6.0.5 针对的是 EFCore 6.x 等。

变更日志

  • 添加对 EF Core 7.0 的支持

  • 移除 IShardingModelCacheOption,为默认缓存设置进行了建议配置

  • 添加模型并发等级,以便解决模型超时 BUG

  • 修正 FromSqlRaw 丢失 where 子句的 BUG #217

  • 修正分片路由为空时,join 未分片对象,导致分片对象被误认为非分片对象的 BUG

  • 修正集成使用 Z.EntityFramework.Plus 批量处理时报错的 BUG #179

  • 启用了全新的版本规范,版本号第二位对应 EF Core 版本号

  • 其他

重要提示

  • 升级如果不使用app.ApplictaionServices.UseAutoShardingCreate()将不会自动创建表任务;

  • 如果使用 IIS 代理,需要关闭应用程序池的固定回收,并将空闲回收设置为 0,否则 ShardingCore 的建表任务可能不会生效。

与其他开发框架的集成

目前,NCC ShardingCore 能与多款开发框架进行集成,开发者可以通过阅读项目文档,对照官方 DEMO 快速上手集成。ShardingCore 目前提供了以下开发框架的集成 DEMO:

  • 原生 EF Core (自不必说)

  • Volosoft AbpVNext

  • Volosoft AbpZero

  • Furion

  • WTM

详情可参考:

  • https://github.com/dotnetcore/sharding-core/tree/main/samples

  • https://www.cnblogs.com/xuejiaming/p/16450663.html

  • Volosoft AbpVNext Demohttps://github.com/xuejmnet/ShardingWithFramework/tree/main/abp/toapp

  • FurionDemohttps://github.com/xuejmnet/ShardingWithFramework/tree/main/furion

  • WTM Demohttps://github.com/xuejmnet/ShardingWithFramework/tree/main/wtm

现有系统接入注意事项

现有系统接入 ShardingCore,需要注意以下几点

批处理 Batch Ops

ShardingCore 支持 Ef Core 生态下的多个批处理框架,其中代表作比如:

  • Z.EntityFramework.Plus.EFCore

  • EFCore.BulkExtensions

默认的 EF Core  批处理基于当前 DbContext,如果开发者自定替换了 DbContext,则在集成 ShardingCore 时,需要注意批处理的兼容情况。ShardingCore 在默认情况下,ShellDbContext 带多个 ExecutorDbContextShellDbContext 会代理原有的查询,故而原有的批处理工作不能在 DbContext 中使用。

具体可参考 ShardingCore 批量操作文档:https://xuejmnet.github.io/sharding-core-doc/adv/batch-operate/

追踪 Tracking

默认情况下,ShardingCore 支持 EFCore 的追踪功能(即便是读写分离的情况下),支持包括 SelectAddUpdate 和 Remove,但无法获取 DbContext.ChangeTracker 下的方法。目前有两种解决方案:

  1. 重写 ChangeTracker,可以参考本项目的 ShardingChangeTracker,通过替换 IChangeTrackerFactory 来实现;

  2. 通过 AbstractShardingDbContext 下的 IShardingDbContextExecutor 获得当前 DbContext,而后进行相应的操作。

如果需要在 SaveChanges 时对一些变更新信息进行记录(如审计等),可通过重写带有 Boolean 参数的 SaveChanges 方法来达到目的:

public override int SaveChanges(bool acceptAllChangesOnSuccess)

    if (IsExecutor)
    
        // 审计操作
        // ChangeTracker.Entries().Where(xxx)
    
    
    return base.SaveChanges(acceptAllChangesOnSuccess);

常见问题

使用外键报错

建议移除外键。参考:
https://github.com/dotnetcore/sharding-core/blob/main/samples/Sample.Migrations/RemoveForeignKeyMigrationsModelDiffer.cs

没有自动建表
  • 检查 IIS 设置,关闭应用程序池的固定回收,并将空闲回收设置为 0

  • 检查数据库连接对应的账户是否具有建表权;

  • 检查各路由建表的时间节点所对应的日志;

  • 选择开启 DoLogError,错误日志将详细输出。

不想在默认的时间点建表

修改对应的 CRON 表达式方法:*GetCronExpressions()*,并重写 IncrementMinutes 的值。

如何选择版本

ShardingCore 版本号中的第二位对应了 EF Core 的版本号,因此在选择 ShardingCore 时,请认准第二位版本号的编号;ShardingCore 第一位表示大版本号,第三位和第四位是小版本号,一般这三位数选择最新版本即可。

  1. EFCore 7.x 选择 ShardingCore 7.7.x.x

  2. EFCore 6.x 选择 ShardingCore 7.6.x.x

  3. EFCore 5.x 选择 ShardingCore 7.5.x.x

  4. EFCore 3.x 选择 ShardingCore 7.3.x.x

  5. EFCore 2.x 选择 ShardingCore 7.2.x.x

以上是关于ShardingCore批量插入的主要内容,如果未能解决你的问题,请参考以下文章

DocumentFragment批量操作dom

KDoc:插入代码片段

ShardingCore 如何呈现“完美”分表

代码片段使用复杂的 JavaScript 在 UIWebView 中插入 HTML?

将代码片段插入数据库并在 textarea 中以相同方式显示

“ShardingCore”是如何针对分表下的分页进行优化的