Время ожидания:
Истекло время ожидания. Время ожидания истекло до завершения операции, или сервер не отвечает. \ R \ nНе выполняется оператор.
У меня есть 17 миллионов записей для сохранения в моей базе данных приложения. Эти 12 миллионов записей являются результатом операции сравнения двух записей базы данных.
Я сравниваю 2 записи базы данных, затем заполняю записи несоответствия (на основе некоторых критериев) в таблице данных, и как только эта таблица данных достигает некоторого предела, например
1000 или 500 и т. Д. Я отправляю эту таблицу данных в массовую копию SQL для массового импорта, а затем очищаю таблицу данных.
Я делаю всю эту операцию внутри транзакции, чтобы я вставил Х-записи, и в процессе сравнения возникает любая ошибка, поэтому я откатив эти Х-записи.
Но из-за этого у меня возникает проблема тайм-аута при выполнении массового копирования.
Я проверил различные варианты 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
. Теперь это работает до сброса 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);
}
}
}
}