Я в основном из базы данных и нового в .net. Пожалуйста, несите меня, если мой вопрос звучит глупо.Retryable SQLBulkCopy для SQL Server 2008 R2
Я использую 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);
}
}
}
Показать код C#, где вы делаете SqlBulkCopy. –
@SarveshMishra, обновил описание с помощью кода. – SumanKumar