Dynamics 365 Customer Engagement的标准导入不支持并行导入了吗?
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复351或者20190816可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!
利用标准的导入功能来导入数据是基本操作,操作起来简单引用,比较受用户喜欢,而且导入速度也可以,特别是并行导入的情况下。
最近碰到用CSV来导入数据,在导入之前将数据拆分成多个CSV文件,每个文件不超过8M,这些CSV文件打包成Zip文件后不超过32MB,上传后是差不多一个一个处理,并行处理没有那么明显了。如下图,我最开始用一个csv上传了一个文件进行导入,后面我用一个zip包上传了5个csv文件来导入,这个zip文件中的5个文件要会等到第一个处理完毕后再开始。然后zip中的文件有些并行处理,但是看起来不明显,下图可以看到 data02.csv 和 data03.csv都处于解析阶段。
我的印象中,Dynamics 365 CRM V8.X是可以并行导入的,而且处理速度挺快的,是Dynamics 365 Customer Engagement V9.X开始因为调用API的限制等并行不是那么厉害了吗?如果是,谁看到哪儿有说明请告知我,我更新下本博文,可由什么参数可以更改此类设置。
我查看了导入相关的部署属性,参考 Update deployment configuration settings ,查看的命令参考如下:
Add-PSSnapin Microsoft.Crm.PowerShell
Get-CrmSetting ImportSettings
我的环境显示结果如下,这些值应该是默认值。
如果是一个文件一个文件导入,速度不会很快,我们可以用程序来导入,多线程加上ExecuteMultipleRequest消息速度还是可以的。
- 导入文件的文件名尽量用字母数字,不要包括空格,汉字,特殊符号等。
- CSV文件的编码是UTF-8,而不是ANSI,因为ANSI编码不支持中文,导入后会发现中文是乱码!
- 导入尽量用CSV格式,而不是Excel。
- 对于有1:N关系的实体导入,最好能从源头生成GUID作为父实体的主键,然后导入子实体的时候直接利用前面生成的GUID,这样处理速度会快很多。
- 对于每行记录最好有一个惟一键,如果没有可以用自增列(或者Excel生成一个序号)或者GUID作为惟一键,这样方便后续或者后台比较数据导入的成果。
- 如果导入消息执行非常快,可能会碰上调用API的限制,调用API的限制请参考官方文档:API Limits ,这个时候通过ExecuteMultipleRequest消息和使用不同的账号来执行可以降低概率。
- 如果可以,为每个要导入的文件准备一个整数,作为导入记录的 importsequencenumber 字段值,方便分析每个文件导入数据的情况。
- 最好每个文件的行数不要超过10万,因为情况下导出记录到Excel的条数是10万。
- 导入的程序最好放到服务器上运行,提升连接速度,同时也一般不容易像自己的机器一样关机或者重启会中断导入
我这里贴一个导入的代码:
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Messages;
using System;
using System.Configuration;
using System.IO;
using System.ServiceModel;
using System.Threading; namespace BulkImportRecords
{
class Program
{
public static IServiceManagement<IOrganizationService> sm;
public static AuthenticationCredentials authCredentials;
static int importsequencenumberstartat = Convert.ToInt32(ConfigurationManager.AppSettings["importsequencenumberstartat"]);
static int threadcount = Convert.ToInt32(ConfigurationManager.AppSettings["threadcount"]);
static void Main(string[] args)
{
sm = ServiceConfigurationFactory.CreateManagement<IOrganizationService>(new Uri(ConfigurationManager.AppSettings["orgUrl"]));
authCredentials = new AuthenticationCredentials();
authCredentials.ClientCredentials.UserName.UserName = ConfigurationManager.AppSettings["userName"];
authCredentials.ClientCredentials.UserName.Password = ConfigurationManager.AppSettings["passWord"];
authCredentials = sm.Authenticate(authCredentials);
try
{
for (var i = ; i < threadcount; i++)
{
Thread newThread = new Thread(new ParameterizedThreadStart(Work));
newThread.Start(i);
}
Console.ReadKey();
}
catch (FaultException ex)
{
Console.WriteLine("程序出现异常:ex.Message=" + ex.Message);
Console.ReadKey();
}
} static void Work(object data)
{
try
{
Console.WriteLine("线程开始" + DateTime.Now.ToLongTimeString() + ";线程ID:" + Thread.CurrentThread.ManagedThreadId + ";接收的参数值为:" + data.ToString());
int importsequencenumber = importsequencenumberstartat + Convert.ToInt32(data);
OrganizationServiceProxy orgSvc = new OrganizationServiceProxy(sm, authCredentials.ClientCredentials);
//OrganizationServiceProxy orgSvc = new OrganizationServiceProxy(sm, authCredentials.SecurityTokenResponse);
//ManagedTokenOrganizationServiceProxy orgSvc = new ManagedTokenOrganizationServiceProxy(sm, authCredentials.ClientCredentials);
string strReadFilePath = ConfigurationManager.AppSettings["filename"];
int i = ;
int j = ;
int z = ;
ExecuteMultipleRequest multiReqs = new ExecuteMultipleRequest()
{
Settings = new ExecuteMultipleSettings()
{
ContinueOnError = true,
ReturnResponses = false
},
Requests = new OrganizationRequestCollection()
};
using (StreamReader srReadFile = new StreamReader(string.Format(strReadFilePath, (Convert.ToInt32(data) + ).ToString(""))))
{
while (!srReadFile.EndOfStream)
{
string strReadLine = srReadFile.ReadLine(); //读取每行数据
if (i != )//如果第一行包括标题的话要过滤掉
{
var arrLine = strReadLine.Split(',');
CreateRequest req = new CreateRequest();
var createEntity = new Entity("ly_test");
createEntity["ly_name"] = arrLine[];
createEntity["ly_singletext1"] = arrLine[];
createEntity["ly_singletext2"] = arrLine[];
createEntity["ly_singletext3"] = arrLine[];
createEntity["importsequencenumber"] = Convert.ToInt32(importsequencenumber);
req.Target = createEntity;
if (j <= )
{
multiReqs.Requests.Add(req);
}
else
{
multiReqs.Requests = new OrganizationRequestCollection();
multiReqs.Requests.Add(req);
j = ;
}
if (j == )
{
orgSvc.Execute(multiReqs);
Console.WriteLine("线程:" + Thread.CurrentThread.ManagedThreadId + "-导入完毕" + z + "条" + DateTime.Now.ToString());
}
z++;
j++;
}
i++;
}
}
orgSvc.Execute(multiReqs);
Console.WriteLine("线程结束" + DateTime.Now.ToLongTimeString() + ";线程ID:" + Thread.CurrentThread.ManagedThreadId);
}
catch(FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> ex)
{
Console.WriteLine("执行遇到异常:" + ex.Detail.ErrorCode + ex.Message + ex.StackTrace);
}
catch (Exception e)
{
Console.WriteLine("执行遇到异常:" + e.Message + e.StackTrace);
}
}
}
}
这个程序配合的配置文件如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>
</startup>
<appSettings>
<add key="userName" value="crmadmin@luoyong.me"/>
<add key="passWord" value="Pass"/>
<add key="orgUrl" value="https://demo.luoyong.me/XRMServices/2011/Organization.svc"/>
<add key="filename" value="D:\dataimport\data{0}.csv"/>
<add key="importsequencenumberstartat" value="1000000"/>
<add key="threadcount" value="10"/>
</appSettings>
</configuration>
Dynamics 365 Customer Engagement的标准导入不支持并行导入了吗?的更多相关文章
- 利用Dynamics 365 Customer Engagement的标准导入功能导入附件。
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- Dynamics 365 Customer Engagement导入解决方案时出错:Microsoft.Crm.CrmException: Plug-in assembly does not contain the required types or assembly content cannot be updated.
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- 利用Azure虚拟机安装Dynamics 365 Customer Engagement之二:创建域控虚拟机
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- 如何让用户登录Dynamics 365 Customer Engagement后自动登录到Unified Interface App?
微软动态CRM专家罗勇 ,回复324或者20190422可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! Dynamics 365 Customer Engagement ...
- Dynamics 365 Customer Engagement中插件的调试
微软动态CRM专家罗勇 ,回复319或者20190319可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 本文主要根据官方的教 ...
- 下载Dynamics 365 Customer Engagement 工具
微软动态CRM专家罗勇 ,回复312或者20190311可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 从Dynamics ...
- Dynamics 365 Customer Engagement安装FAQ
微软动态CRM专家罗勇 ,回复310或者20190308可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 本文参考了包括但不限 ...
- Dynamics 365 Customer Engagement V9 活动源功能报错的解决方法
微软动态CRM专家罗勇 ,回复300或者20190120可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 安装好Dynamic ...
- 配置基于服务器认证的Dynamics 365 Customer Engagement和SharePoint Online集成
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
随机推荐
- 在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)
题目:在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1) 分析:这道题考察位操作:异或(^),按位与(&),移位操作(>> ...
- universal link使用
iOS9之后,苹果推出了universal link方案,该方案较url scheme有明显的改善.url scheme很难做到唯一. 而 universal link却是你自己控制的. 1.有一个H ...
- Java修炼——面向对象的三大特征_封装的使用
封装的作用含义:程序设计追求"高内聚,低耦合" 1.提高代码的安全性 2.提高代码的复用性 3."高内聚":封装细节,便于修改内部代码,提高可 维护性 4.&q ...
- [TimLinux] Python __hash__ 可哈希集合
规则: __hash__ 应该返回一个整数,hash()函数计算基础类型的hash值 可哈希集合:set(), forzenset(), dict() 三种数据结构操作要求 key 值唯一,判断唯一的 ...
- Seata 客户端需要同时启动 TM 和 RM 吗?
在分析启动部分源码时,我发现 GlobalTransactionScanner 会同时启动 RM 和 TM client,但根据 Seata 的设计来看,TM 负责全局事务的操作,如果一个服务中不需要 ...
- 十大C++实战项目,你会几个?【高薪必备】
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:实验楼 市面上有很多C++的实战项目,从简单到进阶,学习每个项目都 ...
- 016_List/Set/Map
先写一下3这种遍历方法 for循环 List<Teacher> list = new ArrayList<>(); list.add(new Teacher("张三& ...
- 【Git】本地分支
[Git]本地分支 转载:https://www.cnblogs.com/yangchongxing/p/10221382.html 目录 ============================== ...
- Web基础了解版02-JavaScript
JavaScript 特性 ① 解释型语言.JavaScript是一种解释型的脚本语言,JavaScript是在程序的运行过程中逐行进行解释,不需要被编译为机器码再执行. ② 面向对象.JavaScr ...
- Net Core 基于AngleSharp的HTML转实体工具
最近这几天在采集一些房产信息网站的二手房产数据.采用的是.net core 2.2+AngleSharp做的,放在自己服务器上跑着玩.写着写着,发现好麻烦.原因如下 部分代码如下图 1.每个节点都要手 ...