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 带多个 ExecutorDbContext,ShellDbContext 会代理原有的查询,故而原有的批处理工作不能在 DbContext 中使用。
具体可参考 ShardingCore 批量操作文档:https://xuejmnet.github.io/sharding-core-doc/adv/batch-operate/
追踪 Tracking
默认情况下,ShardingCore 支持 EFCore 的追踪功能(即便是读写分离的情况下),支持包括 Select、Add、Update 和 Remove,但无法获取 DbContext.ChangeTracker 下的方法。目前有两种解决方案:
重写 ChangeTracker,可以参考本项目的 ShardingChangeTracker,通过替换 IChangeTrackerFactory 来实现;
通过 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 第一位表示大版本号,第三位和第四位是小版本号,一般这三位数选择最新版本即可。
EFCore 7.x 选择 ShardingCore 7.7.x.x
EFCore 6.x 选择 ShardingCore 7.6.x.x
EFCore 5.x 选择 ShardingCore 7.5.x.x
EFCore 3.x 选择 ShardingCore 7.3.x.x
EFCore 2.x 选择 ShardingCore 7.2.x.x
以上是关于ShardingCore批量插入的主要内容,如果未能解决你的问题,请参考以下文章
代码片段使用复杂的 JavaScript 在 UIWebView 中插入 HTML?