繁体   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