2016-08-29 10 views
5

Tôi cơ bản là từ nền cơ sở dữ liệu và mới đến công cụ .net. Xin vui lòng chịu với tôi nếu câu hỏi của tôi có vẻ ngớ ngẩn.Bản mẫu SQLBulk có thể thử lại cho SQL Server 2008 R2

Tôi đang sử dụng SqlBulkCopy trong mã của mình để chuyển dữ liệu từ máy chủ SQL này sang máy chủ SQL khác. Nhưng nó không thường xuyên do các vấn đề về mạng. Để tránh điều đó tôi đang lên kế hoạch để làm hai việc

  1. Giảm kích thước hàng loạt (5000-1000) và tăng thời gian chờ (từ 3min. Để 1 phút)

  2. Thực hiện retry Logic

Câu hỏi của tôi là

  1. Cách tốt nhất để thực hiện thử lại, nghĩa là ở cấp độ bảng hoặc ở cấp hàng loạt (nếu có khả thi)?
  2. Tôi tìm thấy một số công việc khung cho khả năng phục hồi SQL Azure ở đây: https://msdn.microsoft.com/en-us/library/hh680934(v=pandp.50).aspx Chúng tôi có bất kỳ điều tương tự cho SQL Server 2008 R2 không?

Mẫu Mã mà tôi đang sử dụng:

private void BulkCopyTable(string schemaName, string tableName) 
    {using (var reader = srcConnection.ExecuteReader($"select * from [{SourceDBName}].[{schemaName}].[{tableName}]")) 
      { 
       const SqlBulkCopyOptions bulkCopyOptions = SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.FireTriggers | 
                  SqlBulkCopyOptions.KeepNulls | 
                  SqlBulkCopyOptions.KeepIdentity; 

       using (var bcp = new SqlBulkCopy(dstConnection.ConnectionString, bulkCopyOptions)) 
       { 
        const int threeMinutes = 60*3; 
        bcp.BulkCopyTimeout = threeMinutes; //Timeout is for a single batch 
        bcp.BatchSize = 5000; 
        bcp.DestinationTableName = $"[{DestinationDB}].[{schemaName}].[{tableName}]"; 
        bcp.EnableStreaming = true; 
        foreach (var col in table.Columns.Cast<Column>().Where(c => !c.Computed)) 
        { 
         bcp.ColumnMappings.Add(col.Name, col.Name); 
        } 
        bcp.WriteToServer(reader); 
       } 
      } 
     } 
+0

Hiển thị một số mã C# nơi bạn đang thực hiện SqlBulkCopy. –

+0

@SarveshMishra, đã cập nhật mô tả bằng mã. – SumanKumar

Trả lời

0

Một cách tiếp cận đơn giản là:

  1. Thực hiện các lô chính mình. Điều này dẫn đến sự thiếu hiệu quả nhỏ như SqlBulkCopy cần truy vấn dữ liệu meta cho mỗi cuộc gọi WriteToServer. Vì vậy, không làm cho các lô quá nhỏ. Thí nghiệm.
  2. Đưa vào bảng tạm thời (không phải bảng #temp nhưng bền mà bạn có thể mất kết nối và tiếp tục).
  3. Sau đó, thực hiện insert...select làm bước cuối cùng để di chuyển các hàng từ bảng tạm thời sang bảng thực.

Đoạn nhảy này chia công việc thành các nhóm có thể thử lại nhưng hoạt động như thể đó là một giao dịch.

Nếu bạn không cần nguyên tử, bạn có thể để nó ở bước (1).

Các vấn đề liên quan