[英]Retryable SQLBulkCopy for SQL Server 2008 R2
我基本上是從數據庫背景和.net的新手。 如果我的問題聽起來很傻,請忍受我。
我在代碼中使用SqlBulkCopy將數據從一個SQL Server傳輸到另一個。 但是由於網絡問題,它經常失敗。 為了避免這種情況,我打算做兩件事
減小批量大小(從5000到1000)並增加超時(從3分鍾到1分鍾)
實施重試邏輯
我的問題是
我正在使用的示例代碼:
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);
}
}
}
一種簡單的方法是:
SqlBulkCopy
需要為每個WriteToServer
調用查詢元數據,因此這會導致效率低下。 因此,不要使批次過小。 實驗。 #temp
表,而是一個持久的表,這樣就可以斷開連接並繼續)。 insert...select
作為最后一步,將行從temp表移動到實表。 這種舞蹈將作品分成多個可重試的批次,但就像是一筆交易一樣。
如果不需要原子性,可以將其保留在步驟(1)中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.