[英]Performance issue in bulk importing data in Dynamics CRM
我正在使用 C# 控制台應用程序將數據導入 Dynamics 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 分鍾。 如何改進代碼以減少執行時間。
使用ExecuteMultipleRequest
只能以有限的方式提高數據吞吐量。 這是因為 Dynamics CRM 服務器按順序處理其中的請求,而不是並行處理。 因此,您的主要收獲是減少了到服務器的往返次數。
使用多線程時,吞吐量確實可以得到提升。 每個與 CRM 通信的線程都必須獲得自己的IOrganizationService
實例。 默認情況下,CRM 服務器最多接受來自客戶端的 10 個同時連接。 (這是 WCF 默認值。)
在批處理過程中,我傾向於使用具有生產者消費者模式的BlockingCollection<T>
:一個線程生成要發送到 CRM 服務器的請求,多個線程通過將請求從集合中取出並將它們發送到 CRM 來使用這些請求。
如果這里只是數據導入,請嘗試使用 SqlBulkCopy 將數據直接寫入服務器( 示例代碼)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.