Sum*_*mar 5 .net c# sql-server sqlbulkcopy sql-server-2008-r2
我基本上是从数据库背景和新的.net的东西.如果我的问题听起来很愚蠢,请耐心等待.
我在我的代码中使用SqlBulkCopy将数据从一个SQL Server传输到另一个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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
一个简单的方法是:
SqlBulkCopy每次调用都需要查询元数据WriteToServer。所以批量不要太小。实验。#temp表,而是持久表,以便您可以断开连接并继续)。insert...select作为最后一步,将行从临时表移动到实际表。这种舞蹈将工作分成可重试的批次,但就像一个事务一样。
如果不需要原子性,可以将其保留在步骤 (1) 中。
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |