2014-02-13 2 views
0

Я написал немного кода для обработки данных для всеобъемлющей транзакции. Однако я страдаю бесконечными проблемами и тупиками. Если я запустил свой код на небольшом наборе данных, он работает так, как ожидалось. Но теперь, когда у меня была восстановлена ​​производственная среда для тестирования db, чтобы получить полный объем тестирования. В основном я тратил свое время, насколько я могу судить.Необходимо запустить приложение консоли миграции: слишком много процессов убийства записей - не знаю, как решить

private static void AddProvisionsForEachSupplement2(ISupplementCoordinator supplmentCord) 
    { 


     var time = DateTime.Now; 
     using (var scope = new UnitOfWorkScope()) 
     { 
      var supplements = supplmentCord.GetContracts(x => x.EffectiveDate <= new DateTime(2014, 2, 27)).AsEnumerable(); 

      foreach (var supplement in supplements){ 

        var specialProvisionTable = supplement.TrackedTables.FirstOrDefault(x => x.Name == "SpecialProvisions"); 


        SetDefaultSpecialProvisions(specialProvisionTable, supplement); 


        Console.Out.WriteLine(supplement.Id.ToString() + ": " + (DateTime.Now - time).TotalSeconds); 

      } 

     } 
    } 

Вы можете видеть, что я решил проверить свою синхронизацию, она занимает примерно 300+ секунд, чтобы завершить цикл, а затем «фиксации», что происходит неприлично долго. Наверное, дольше.

Я получаю эту ошибку:

The transaction associated with the current connection has completed but has not been disposed. The transaction must be disposed before the connection can be used to execute SQL statements. 

Я добавил [Transaction (таймаут = 6000)], чтобы получить даже, что, прежде чем я получаю тайм-аут транзакции.

ответ

0

Существует так много информации, что нам нужно, и дать окончательный ответ будет жестким. Однако при работе с большими наборами данных в одной массивной транзакции всегда будет ухудшаться производительность.

Однако, первое, что я хотел бы сделать, тоже быть честным - это подключить профилировщик SQL (например, NHProf или профайлер SQL или даже Log4Net), чтобы узнать, сколько запросов вы отправляете. Затем при тестировании вы можете увидеть, можете ли вы уменьшить количество запросов, которые, в свою очередь, сократят время.

Затем после работы на это у вас есть несколько вариантов: -

  1. Используйте сессионный, чтобы захватить данные, но это удаляет отслеживание изменений, так что вам нужно будет упорствовать позже вручную
  2. Снизить сингл крупные сделки на более мелкие сделки (это то, что я хотел бы начать с)
  3. Смотрите, если хотят загружая всю массу данных в один удар может быть более эффективным
  4. Смотрите при использовании batching собирается помочь вам

Не сдаваться, бороться и понять, почему это дает вам проблемы, это ключ становится мастером NHibernate (а не рабом)

Хороший luck :)

+0

Спасибо Rippo, я старался быть кратким. Я добавлю sme дополнительную информацию, хотя я бы разместил ее как среднее число запросов на шесть цифр. Я больше не могу его обрезать, чем без переписывания всего бэкэнда проекта, который является «dev complete», это для ретроактивного обновления db. Для того, чтобы продемонстрировать, сколько мусора в этом проекте, я бы сказал, что в этом проекте много мусора, поэтому я надеялся, что указание waaaay слишком велико и тайм-аут транзакции приведет к тому же ответу, если бы это было 100k запросов или 600k запросов. – Seth