场景:
根据记录键是否存在于 CRM 中,从外部数据库创建或更新 CRM 中的记录。
平台:CRM 2015 Online。
方法 SSIS,带有 .Net 4 脚本组件
问题: 无论我做什么,我每秒都无法获得超过 1 条记录。我真的希望我做错了什么
我在做什么:
- 使用 Guid 和 Key 字段从 CRM 获取所有记录的列表。
- 将记录分成多个任务。
- 根据 (1) 中的先前列表中是否存在记录,使用 Create 或 Update 在每个任务中创建 ExecuteMultipleRequest。
- 为每个线程创建一个 OrganizationService(在连续线程循环样式之间重用(参见下面的代码))。
- 运行执行多个。
- 为速度哭泣。
结果似乎不会随着并行任务的数量或批量大小而变化。它基本上总是每秒大约 0.9-1.5 条记录。
我已经尝试过从 1 个线程(1000 件)到 16 个线程(每个线程 1 件)的所有方法。
这篇声称每秒 200-300 条记录是可能的帖子正在嘲讽我一些激烈的事情:邪恶的嘲讽博客帖子,每秒 300 条记录到 CRM 在线
项目中的代码片段(试图只复制可能相关的内容):
上下文创建。
foreach (int i in Enumerable.Range(1, _MaxThreads * 2))
{
var crmConnection = CrmConnection.Parse(connectionString);
var organisationservice = new OrganizationService(crmConnection);
_OrgServiceList.Add(organisationservice);
}
我如何创建我的任务:
private void ImportNewBatch(List<Customer> dataSet)
{
var service = _OrgServiceList[_CurrentServicePosition];
_CurrentServicePosition++;
if (_CurrentServicePosition >= _OrgServiceList.Count)
_CurrentServicePosition = 0;
var aTask = new Task(() => WorkerThread(dataSet, service), TaskCreationOptions.None);
aTask.Start();
_RunningThreads.Add(aTask);
if (_RunningThreads.Count >= _MaxThreads)
Task.WaitAny(_RunningThreads.ToArray());
_RunningThreads.RemoveAll(t => t.IsCompleted);
}
执行多个查询
var requestWithResults = new ExecuteMultipleRequest()
{
Settings = new ExecuteMultipleSettings()
{
ContinueOnError = true,
ReturnResponses = true
},
Requests = new OrganizationRequestCollection()
};
更新 1 从 Microsoft 获得了关于在线 CRM 的半非官方答案,其他人可能也会感兴趣:
- 在线 CRM 的良好性能约为 10 条记录/秒。
- 性能很大程度上取决于您是否有插件。
- CRM Online 会限制多个查询,以便一次只能运行两 (2) 个查询,这两个查询之后的所有查询都将依次排队和处理。
- CRM 检查您的 ip 和登录名,因此您无法绕过多个用户或单独上下文的限制。
- 拥有更多许可证的解决方案将为您带来更高的性能,即,在所有其他条件相同的情况下,拥有 100 个许可证的实例将比拥有 5 个许可证的实例快。