如何降低Kingswaysoft运行速度以避免集成崩溃?
解决Dataverse导入速度过快导致集成崩溃的问题
背景与现有尝试
需要将SQL数据库中255行数据导入Dynamics 365 Dataverse表,Kingswaysoft默认每秒处理1条的速度会导致Dynamics与遗留系统的集成崩溃,且生产系统无法关闭集成。
已做尝试:
- 添加Script Component并使用以下代码,试图限制为每5秒处理1条,但仅阻塞了ClientGroup Inner Join和Script Component步骤,未达预期:
public override async void Input0_ProcessInputRow(Input0Buffer Row) { Thread.Sleep(5000); }
- 已关闭CRM Destination的多线程设置,将批量大小设为1。
编辑:完整数据流为:SQL数据源 → Lookup组件 → ClientGroup Inner Join → Script Component → CRM Destination
可行的降速方法
1. 修正Script Component的延迟逻辑
当前代码用async void搭配同步的Thread.Sleep,会导致SSIS线程处理异常,延迟未作用到下游输出。改成以下两种方式之一:
- 同步处理(确保组件为同步模式):
public override void Input0_ProcessInputRow(Input0Buffer Row) { System.Threading.Thread.Sleep(5000); }
- 异步处理(将组件设为异步模式):
public override async Task Input0_ProcessInputRowAsync(Input0Buffer Row) { await Task.Delay(5000); }
设置为异步模式后,每一行处理完成后会先延迟,再向下游的CRM Destination输出,能真正控制每行的处理间隔。
2. 利用Kingswaysoft组件自带节流配置
检查CRM Destination组件的属性设置:
- 部分版本的Kingswaysoft组件支持请求间隔(Request Interval),直接设置每次Dataverse请求之间的延迟毫秒数(比如5000),无需额外代码。
- 确认是否有批次间隔设置,即使批量大小设为1,也能强制每批次(单条)之间等待指定时间。
3. 控制流循环逐行处理
将数据流拆分为控制流循环,每次仅处理1条数据:
- 创建变量记录已处理行数(初始值0)。
- 用While循环作为控制流容器,循环条件为
已处理行数 < 255。 - 循环内依次执行:
- 数据流任务:通过变量过滤,从SQL读取1条未处理的数据,导入Dataverse。
- 脚本任务:执行
System.Threading.Thread.Sleep(5000)实现延迟。 - 变量赋值任务:将已处理行数加1。
4. SQL查询层面添加延迟
在SQL数据源的查询中,配合控制流逐行读取并添加延迟:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY [主键字段]) AS RowNum FROM [源表名] ) t WHERE RowNum = ? -- 绑定控制流中的行数变量 WAITFOR DELAY '00:00:05'
这种方式能确保每读取一行就等待5秒,再进入后续数据流处理。
关键注意点
从数据流结构来看,延迟逻辑必须作用于进入CRM Destination前的每一行。如果Script Component是同步模式,上游的Lookup和Join会先处理完所有255行数据,再逐个延迟输出,起不到节流效果——因此必须将Script Component设为异步,让每行处理后立即延迟,再向下游传递。
内容的提问来源于stack exchange,提问作者GalaxyWolf
相关产品推荐
相关产品推荐

