我基本上是从数据库背景转入 .net 领域的。如果我的问题听起来很傻,请原谅。
我在代码中使用 SqlBulkCopy 将数据从一个 SQL Server 转移到另一个,但由于网络问题它经常失败。为了避免这种情况,我计划做两件事:
减少批处理大小(从 5000 到 1000),并增加超时时间(从 3 分钟到 1 分钟)
实现重试逻辑
我的问题是:
- 最好的实现重试的方式是什么?即,在表级别还是批处理级别实现(如果可能的话)?
- 我发现了一些关于 SQL Azure 弹性的框架:https://msdn.microsoft.com/en-us/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);
}
}
}