簡體   English   中英

在 Dynamics CRM 中批量導入數據時出現性能問題

[英]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 來使用這些請求。

  • 您可以讓兩個方法在同一進程中執行多個請求(每個 500 個),使用它可以將時間縮短一半。
  • 分析在執行或 foreach 創建中哪個部分浪費了更多時間。 並寫在這里,所以我無法以更好的方式幫助你

如果這里只是數據導入,請嘗試使用 SqlBulkCopy 將數據直接寫入服務器( 示例代碼)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM