我使用C#控制台应用程序将数据导入动态CRM。我使用以下代码:
public static void Main(string[] args)
{
int totalRecords = dbcon.GetDataCount();
int rowCount = totalRecords / 10;
for (int i = 1, j = 1; i <= totalRecords; i = i + rowCount, j = j + 1)
{
Task myTask = new Task(() => TestMethod(i, (rowCount * j)));
myTask.Start();
}
Task.WaitAll();
}
public static void TestMethod(int startSeqNo, int endSeqNo)
{
IOrganizationService service = getServiceProxcy();
DBConnection dbcon = new DBConnection();
DataTable dt = dbcon.GetData(startSeqNo, endSeqNo);
// Insert Commented
BulkCreate(service, dt);
}
public static void BulkCreate(IOrganizationService service, DataTable dt)
{
// Create an ExecuteMultipleRequest object.
ExecuteMultipleRequest multipleRequest = new ExecuteMultipleRequest()
{
// Assign settings that define execution behavior: continue on error, return responses.
Settings = new ExecuteMultipleSettings()
{
ContinueOnError = false,
ReturnResponses = true
},
// Create an empty organization request collection.
Requests = new OrganizationRequestCollection()
};
foreach (DataRow row in dt.Rows)
{
Entity entity = new Entity("new_dataimporttest");
entity["new_name"] = row["name"].ToString();
entity["new_telephone"] = row["telephone1"].ToString();
if (multipleRequest.Requests.Count == 1000)
{
// Execute all the requests in the request collection using a single web method call.
ExecuteMultipleResponse multipleResponse = (ExecuteMultipleResponse)service.Execute(multipleRequest);
multipleRequest.Requests.Clear();
}
CreateRequest createRequest = new CreateRequest { Target = entity };
multipleRequest.Requests.Add(createRequest);
}
// Execute all the requests in the request collection using a single web method call.
if (multipleRequest.Requests.Count > 0)
{
ExecuteMultipleResponse multipleResponse = (ExecuteMultipleResponse)service.Execute(multipleRequest);
}
}
我正在使用任务并行库。它工作正常,但问题是当执行跟随行时需要时间。
// Execute all the requests in the request collection using a single web method call.
// ExecuteMultipleResponse multipleResponse = (ExecuteMultipleResponse)service.Execute(multipleRequest);
我希望提高代码的性能,因为我正在导入大量数据近100万条记录。目前需要1小时50分钟。如何改进代码以减少执行时间。
答案 0 :(得分:1)
使用ExecuteMultipleRequest
数据吞吐量只能以有限的方式增强。这是因为Dynamics CRM服务器按顺序处理其中的请求,而不是并行处理。因此,您的主要收益是减少到服务器的往返。
使用多个线程时,通常可以提高吞吐量。与CRM通信的每个线程都必须拥有自己的IOrganizationService
实例。默认情况下,CRM服务器最多可同时接收来自客户端的10个连接。 (这是WCF的默认设置。)
在批处理过程中,我倾向于使用带有生产者 消费者模式的BlockingCollection<T>
:一个线程生成要发送到CRM服务器的请求和多个线程通过将它们从集合中取出并将它们发送到CRM来消耗请求。
答案 1 :(得分:0)
答案 2 :(得分:0)
如果只是数据导入是这里的目的,请尝试使用SqlBulkCopy将数据直接写入服务器(Sample Code)。