gpt4 book ai didi

c# - SQL Server 2008 R2 的可重试 SQLBulkCopy

转载 作者:太空狗 更新时间:2023-10-29 23:49:49 24 4
gpt4 key购买 nike

我基本上来自数据库背景和 .net 的新东西。如果我的问题听起来很愚蠢,请耐心等待。

我在我的代码中使用 SqlBulkCopy 将数据从一个 SQL Server 传输到另一个 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);
}
}
}

最佳答案

一个简单的方法是:

  1. 自己实现批处理。这会导致效率低下,因为 SqlBulkCopy 需要为每个 WriteToServer 调用查询元数据。所以不要使批处理太小。实验。
  2. 插入临时表(不是 #temp 表,而是持久表,这样您就可以断开连接并继续)。
  3. 然后,执行 insert...select 作为将行从临时表移动到真实表的最后一步。

这种舞蹈将工作分成可重试的批处理,但表现得好像它是一个事务。

如果您不需要原子性,您可以将其留在第 (1) 步。

关于c# - SQL Server 2008 R2 的可重试 SQLBulkCopy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39198782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com