2013-09-13 5 views
0

Мне нужно вставить некоторую запись в базу данных, но она занимает слишком много времени около 20-25 секунд. У меня два метода сначала содержит цикл foreach с параметром типа списка, а второй метод имеет некоторый запрос Linq для сохранения и удаления некоторой записи. Код приведен ниже.Сохранение базы данных занимает слишком много времени

public void InsertAssignment(List<TIVGroupItem> Item) 
     { 
      using (var tr = session.BeginTransaction()) 
      { 
       try 
       { 
        foreach (var item in Item) 
        { 
         ak_tIVGroupItemSelector_Insert(item); 
        }     
        tr.Commit(); 
       } 
       catch (Exception ex) 
       { 
        tr.Rollback(); 
        CusException cex = new CusException(ex); 
        cex.Write(); 
       } 
      } 

     } 

второй метод

public void ak_tIVGroupItemSelector_Insert(TIVGroupItem GroupItem) 
     { 
      try 
      { 
       var result = (from i in session.Query<TIVGroupItem>() 
           where i.Id == GroupItem.Id 
           select i).SingleOrDefault(); 
       if (result != null) 
        session.Delete(result); 
       session.Save(GroupItem); 
      } 
      catch (Exception ex) 
      { CusException cex = new CusException(ex); 
        cex.Write(); 
      } 
     } 

Список элементов содержит несколько записей. Итак, как я могу улучшить свою производительность с помощью такого типа проблем. Есть ли способ увеличить мою производительность, чтобы сохранить запись в базе данных?

+1

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

+0

Можете ли вы переместить 'session.Query ()' в 'InsertAssignment' и передать его как параметр в' ak_tIVGroupItemSelector_Insert'? –

+0

Алессандро Д'Андрия: Я тебя не понял. –

ответ

3

С настройками NHibernate по умолчанию каждый раз, когда вы запрашиваете NHibernate, будет проверяться, содержит ли сессия какие-либо изменения, которые могут повлиять на результат запроса. Так как количество объектов, активных в сеансе, растет, если вы повторяете запрос, производительность снижается.

Избегайте делать запросы в цикле. Лучше сначала запрашивать несколько объектов.

Кроме того, вы загружаете объект с помощью первичного ключа, для которого вы должны использовать session.Get (id). Это намного быстрее, так как оно обходит упомянутую выше грязную проверку, а также сначала заглянет в кеш первого уровня сессии.

Но, как и другие, вы, кажется, удаляете объект и затем сразу же возвращаете его обратно - то есть, как правило, это должно быть обновление вместо удаления + вставки.

Смежные вопросы