簡體   English   中英

SQL Server 2008 R2的可重試SQLBulkCopy

[英]Retryable SQLBulkCopy for SQL Server 2008 R2

我基本上是從數據庫背景和.net的新手。 如果我的問題聽起來很傻,請忍受我。

我在代碼中使用SqlBulkCopy將數據從一個SQL Server傳輸到另一個。 但是由於網絡問題,它經常失敗。 為了避免這種情況,我打算做兩件事

  1. 減小批量大小(從5000到1000)並增加超時(從3分鍾到1分鍾)

  2. 實施重試邏輯

我的問題是

  1. 什么是實現重試的最佳方法,即在表級別還是在批處理級別(如果可能)?
  2. 我在這里找到了一些用於彈性SQL Azure的框架: https : //msdn.microsoft.com/zh-cn/library/hh680934(v= pandp.50).aspx對於SQL Server 2008 R2,我們是否有類似的東西?

我正在使用的示例代碼:

  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);
                }
            }
        }

一種簡單的方法是:

  1. 自己實施批次。 由於SqlBulkCopy需要為每個WriteToServer調用查詢元數據,因此這會導致效率低下。 因此,不要使批次過小。 實驗。
  2. 插入一個臨時表(不是#temp表,而是一個持久的表,這樣就可以斷開連接並繼續)。
  3. 然后,執行insert...select作為最后一步,將行從temp表移動到實表。

這種舞蹈將作品分成多個可重試的批次,但就像是一筆交易一樣。

如果不需要原子性,可以將其保留在步驟(1)中。

暫無
暫無

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

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