C # ASP.Net: Исключение (только несколько раз) при длительной работе базы данных - PullRequest
0 голосов
/ 18 июня 2011

У нас есть веб-приложение 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();

            }
        }


    }

Ответы [ 2 ]

3 голосов
/ 18 июня 2011

Вероятно, проблема в том, что время соединения с SQL Server истекло - время ожидания по умолчанию для соединений и команд составляет 30 секунд.

Вы можете либо увеличить время ожидания (в строке подключения и в коде), либо разбить обновления на куски.

1 голос
/ 19 июня 2011

Спасибо, Одед, за терпеливые ответы на мои вопросы.Моя проблема была решена, когда я разбил огромные операции с базой данных на небольшие партии (после настройки MSDTC).

Во время операций с большой базой данных может возникнуть ошибка недостаточной памяти.Но эта ошибка может не отображаться, если она находится внутри транзакции.

1) Удалите транзакцию и посмотрите, доступно ли исключение «Недостаточно памяти».

2) Разбейте большие операции базы данных на небольшие пакетычтобы удалить исключение «Недостаточно памяти»

3) Настройте MSDTC на уровне приложений и в базе данных

4) Убедитесь, что время ожидания WCF не истекло внезапно.У него должно быть достаточно времени на основе операций с базой данных.

5) Наблюдайте за поведением при перезапуске сервера базы данных (это последний вариант)

Некоторая полезная информация доступна в

Недостаточно системной памяти в пуле ресурсов «по умолчанию» для выполнения этого запроса

Исключение MSDTC во время транзакции: C #

C # ASP.Net: Исключение (только несколько раз) при длительной работе с базой данных

Ошибка SQL Server 2005 701 - недостаточно памяти

Некоторые другие проверки:

1) Есть ли у учетной записи Windows, под которой работает ядро ​​базы данных, «Блокировка страниц в разрешении памяти»?

2) Версия пакета обновления Chek SQL Sever.

3) Проверить размерфайла подкачки виртуальной памяти

4) Проверка максимальной памяти сервера

5) Определение настроек MemToLeave

6) «Конфигурация памяти SQL Server и MemToLeave»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...