SQL Server 2008 R2的可重试SQLBulkCopy

5

我基本上是从数据库背景转入 .net 领域的。如果我的问题听起来很傻,请原谅。

我在代码中使用 SqlBulkCopy 将数据从一个 SQL Server 转移到另一个,但由于网络问题它经常失败。为了避免这种情况,我计划做两件事:

  1. 减少批处理大小(从 5000 到 1000),并增加超时时间(从 3 分钟到 1 分钟)

  2. 实现重试逻辑

我的问题是:

  1. 最好的实现重试的方式是什么?即,在表级别还是批处理级别实现(如果可能的话)?
  2. 我发现了一些关于 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);
                }
            }
        }

展示一些使用SqlBulkCopy进行操作的C#代码。 - Sarvesh Mishra
@SarveshMishra,已更新代码描述。 - SumanKumar
1个回答

0

一个简单的方法是:

  1. 自己实现批处理。这会导致一些效率上的损失,因为每次 WriteToServer 调用时,SqlBulkCopy 都需要查询元数据。所以不要把批处理做得太小,可以进行试验。
  2. 插入到一个临时表中(不是 #temp 表,而是一个持久化的表,这样即使失去连接也可以继续)。
  3. 然后,执行一个 insert...select 作为最后一步,将行从临时表移动到真正的表中。

这个过程将工作分成了可重试的批处理,但表现得就像是一个事务。

如果您不需要原子性,可以停留在第一步。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接