У нас есть веб-приложение ASP.Net, которое подключается к своему бизнес-уровню с помощью WCF.Иногда я получаю исключение, когда выполняю огромную операцию.Интересно то, что когда я впервые запустил его, он был успешным.После этого возникает исключение.
Исключение: соединение с сокетом было прервано.
Операция состоит в том, что он загружает почтовые индексы в таблицы базы данных из файла CSV.Сначала мы читаем из CSV-файла и создаем одну длинную строку почтовых индексов.Это передается хранимой процедуре, и операции с базой данных выполняются.
Примечание 1 :) Когда я установил точку останова и протестировал ее, стало ясно, что создание строки (после получения данных из csv и добавления) выполняется довольно быстро (менее одной минуты).
Примечание 2 :) Я удалил транзакцию (из кода C #) и протестировал, даже тогда есть исключение.
Примечание 3 :) В csv есть одна lakh (сто тысяч) записей.Каждая строка имеет четыре столбца (ZipCode, Город, Округ, Штат).Размер файла CSV составляет 3 МБ.
У меня возникли сомнения по поводу размера журнала транзакций.Затем я сжал файл журнала, используя следующую команду.DBCC SHRINKFILE ('MyDB_log', 1) GO
Затем я проверил размер журнала с помощью SELECT [Размер], Max_Size, Data_Space_Id, [File_Id], Type_Desc, [Имя] FROM FRAMIS_R2075.sys.database_files WHERE data_space_ =0
Размер 128;Максимальный размер 268435456;Type_Desc = «LOG»
Даже после сжатия исключение все еще наступает.
Framework: .Net 3.0
БД: SQL Server 2005
Хорошо,Похоже, что на бизнес-уровне есть и ожидание, когда я ждал еще 20 минут.В нем говорилось: «Недопустимая попытка вызвать Read, когда вызывается читатель».Увидев это, я удалил DbDataReader и использовал SqlCommand для обновления таблиц базы данных.Опять же, на бизнес-уровне произошло исключение, после 20 минут произнесения «Исключение тайм-аута».Есть идеи, почему это происходит?
private void ProcessDatabaseOperationsForZipCode(StringBuilder dataStringToProcess, int UserID)
{
int CountOfUnchangedZipCode = 0;
string strRetiredZipCode = "";
string strNewZipCode = "";
dataStringToProcess.Remove(dataStringToProcess.Length - 1, 1);
if (dataStringToProcess.Length > 0)
{
//TimeSpan.FromMinutes(0) - to make transaction scope as infinite.
using (TransactionScope transaction = TransactionScopeFactory.GetTransactionScope(TimeSpan.FromMinutes(0)))
{
SqlConnection mySqlConnection = new SqlConnection("data source=myServer;initial catalog=myDB; Integrated Security=SSPI;");
SqlCommand mySqlCommand = new SqlCommand("aspInsertUSAZipCode", mySqlConnection);
mySqlCommand.CommandType = CommandType.StoredProcedure;
mySqlCommand.Parameters.Add("@DataRows",dataStringToProcess.ToString());
mySqlCommand.Parameters.Add("@currDate", DateTime.Now);
mySqlCommand.Parameters.Add("@userID", UserID);
mySqlCommand.Parameters.Add("@CountOfUnchangedZipCode", 1000);
mySqlCommand.CommandTimeout = 0;
mySqlConnection.Open();
int numberOfRows = mySqlCommand.ExecuteNonQuery();
//Database db = DatabaseFactory.CreateDatabase();
//DbCommand cmd = db.GetStoredProcCommand("aspInsertUSAZipCode");
//cmd.CommandTimeout = 0;
//db.AddInParameter(cmd, "@DataRows", DbType.String, dataStringToProcess.ToString());
//db.AddInParameter(cmd, "currDate", DbType.DateTime, DateTime.Now);
//db.AddInParameter(cmd, "userID", DbType.Int32, UserID);
//db.AddOutParameter(cmd, "CountOfUnchangedZipCode", DbType.String, 1000);
//using (DbDataReader rdrUpgradeTypes = (DbDataReader)db.ExecuteReader(cmd))
//{
// //while (rdrUpgradeTypes.Read())
// //{
// // if (!String.IsNullOrEmpty(Utility.GetString(rdrUpgradeTypes, "NewZipCode")))
// // {
// // strNewZipCode = strNewZipCode + "," + Utility.GetString(rdrUpgradeTypes, "NewZipCode");
// // }
// //}
//}
transaction.Complete();
}
}
}