Тайм-аут:
Время ожидания истекло. Период ожидания истекает до завершения операции или сервер не отвечает. \ R \ nПриложение завершено.
У меня есть 17 миллионов записей для дампа в моей базе данных приложений. Эти 12 миллионов записей являются результатом операции сравнения между двумя записями базы данных.
Я сравниваю 2 записи базы данных, а затем заполняю записи несоответствия (на основе некоторых критериев) в таблице данных, и как только таблица данных достигает некоторого предела, например 1000 или 500 и т. Д. Я отправляю эту таблицу данных в объемную копию SQL для массового импорта, а затем пустую таблицу данных ,
Я делаю всю эту операцию внутри транзакции, так что я вставил записи X, и во время процесса сравнения произошла ошибка, поэтому я откажусь от этих записей X.
Но из-за этого у меня возникает проблема с таймаутом, а затем массовая копия.
Я проверил различные разные batchsize like 5000,1000,500,300
и т. Д. Я получаю проблемы с таймаутом во всем этом размере партии.
Как только я установил тайм-аут массового копирования в 0, но затем я ставлю ниже ошибки:
Журнал транзакций для моей базы данных заполнен.
С 1000 записей он достигает 2,7 миллиона, а затем выбрасывает таймаут,
С 500 записями он достиг около 2,1 миллиона записей, а затем выдает ошибку.
С 300 200 100 также он бросает ошибки таймаута.
Я также установил время ожидания соединения в моей строке подключения до 30 минут.
Код:
public class SaveRepo : IDisposable
{
DataTable dataTable;
SqlConnection connection;
string connectionString;
SqlTransaction transaction;
SqlBulkCopy bulkCopy;
int testId,
public SaveRepo (int testId)//testId=10364
{
this.connectionString = connectionString;
dataTable = new DataTable();
connection = new SqlConnection(connectionString);
connection.Open();
transaction = connection.BeginTransaction();
bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction);
bulkCopy.BulkCopyTimeout = 60;
bulkCopy.EnableStreaming = true;
bulkCopy.DestinationTableName = "dbo.Sales";
bulkCopy.BatchSize = 100;
bulkCopy.SqlRowsCopied +=
new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
bulkCopy.NotifyAfter = 100;
}
void Dump()
{
try
{
bulkCopy.WriteToServer(dataTable);
}
catch(Exception ex) // timeout error
{
throw ex;
}
}
void FillDatatable(object[] row)
{
if (dataTable.Rows.Count == 100)
{
Dump();
dataTable.Clear();
}
dataTable.Rows.Add(row);
}
public void End()
{
transaction.Commit();
//dispose the stuffs also
}
}
Есть ли какой-либо другой способ или решение, которое мне не хватает, и может решить эту проблему с таймаутом?
Обновление: после установки BulkCopyTimeout
на 0 и с batchsize =1000
я получил эту ошибку до 3593000 records bulk copied
:
Не удалось выделить пространство для объекта «dbo.Sales». «PK_dbo.Sales» в базе данных «XYZ», потому что файловая группа «PRIMARY» заполнена. Создайте дисковое пространство, удалив ненужные файлы, отбросьте объекты в файловой группе, добавив дополнительные файлы в файловую группу или установив автозапуск для существующих файлов в файловой группе.
Обновление 2: я удалил транзакцию, и я открою и закрою соединение для каждой партии и при сбрасывании любой партии, если произойдет ошибка, я testId
все ранее сохраненные данные с помощью testId
Теперь это работает до сброса 3 millions of data
тогда я получаю эту ошибку:
Не удалось выделить пространство для объекта «dbo.Sales». «PK_dbo.Sales» в базе данных «XYZ», потому что файловая группа «PRIMARY» заполнена. Создайте дисковое пространство, удалив ненужные файлы, отбросьте объекты в файловой группе, добавив дополнительные файлы в файловую группу или установив автозапуск для существующих файлов в файловой группе.
Это происходит в разделе catch, в котором я пытаюсь удалить старые данные на основе testId
но это занимает так много времени, а затем оно вызывает эту ошибку:
Журнал транзакций для моей базы данных заполнен.
void Dump()
{
using (SqlConnection connection =
new SqlConnection(connectionString))
{
connection.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString))
{
bulkCopy.DestinationTableName = "dbo.Sales";
bulkCopy.EnableStreaming = true;
try
{
bulkCopy.WriteToServer(dataTable);
}
catch(Exception ex)
{
connection.Close();
SalesRepo.Delete(connectionString, testId);
}
}
}
}
Таким образом, по второму варианту вы фактически смогли «сбросить» данные, используя код, в базу данных только для того, чтобы узнать, что у вас заканчивается размер файла в базе данных.
Это может произойти, если для автоматического увеличения задано значение «падает» или вы достигли максимального размера файла, доступного на вашем диске.
Ваша первая попытка не удалась, так как транзакция стала слишком большой, чтобы поддерживать использование ресурсов вашего сервера.
Первые 2 вещи:
Потом,
Попробуйте выполнить резервное копирование в середине вашего «импорта», так как резервное копирование сохранит данные, переданные на транснациональном уровне, и ваш файл LDF будет менее подвержен нагрузке.