2012-07-05 17 views
16

Próbuję wstawić duży zbiór obiektów do tabeli przy użyciu płynnego NHibernate, za pomocą wywołania, aby zapisać lub zaktualizować przekazywanie każdej jednostki z kolekcji w pętli foreach. Ustawiłem wielkość partii do wielkości kolekcji, jednak czytałem na blogu Ayende, że ustawienie go na duże wartości nie jest zalecane, więc ograniczyłem ją do 250, jednak kiedy oglądam kolekcję w NHProf, zobacz strumień instrukcji wstawiania (kolekcja zawiera około 20000 elementów) zamiast zestawu połączonych wywołań wstawiania.Wstawianie kolekcji jednostek luzem przy użyciu Fluent NHibernate

Wydaje się to bardzo nieefektywne i zajmuje znacznie więcej czasu, niż można by się spodziewać po kwerendzie, która jest bardzo istotna - wstawienie wartości do 25 kolumn (tak, to jest jedno miejsce, które może być lepsze, ale jest to starsza baza danych, na której utknąłem) do bazy danych SQL Server 2008 - więc mogę tylko założyć, że robię to źle.

Czy istnieje zalecany sposób wstawiania dużych kolekcji obiektów za pomocą NHibernate? Czy można uzyskać wzrost wydajności za pomocą narzędzia Save over SaveOrUpdate?

Kod metody Add - rozmowa SetBatchSize jest, gdy partia jest ograniczona do 250, lub ustawienie wielkości zbiórki, jeśli jest to mniej niż 250:

public void Add(IEnumerable<TEntity> entities) 
{ 
    var session = GetCurrentSession(); 
    using (var transaction = session.BeginTransaction()) 
    { 
     entities = entities.ToList(); 

     session.SetBatchSize(SetBatchSize(entities.Count())); 

     foreach (var entity in entities) 
      session.SaveOrUpdate(entity); 

     transaction.Commit(); 
    } 
} 

przeprosiny za pytanie nieco niejasne, mam uczucie, że podchodzę do rzeczy w niewłaściwy sposób, a wszelkie wskazówki byłyby bardzo cenne!

Odpowiedz

3

Będziesz chciał użyć StatelessSession dla insertów luzem.

(related: Inserts of stateless session of NHibernate are slow)

+1

Dzięki, szukałem w linku, a także zmienił się na wkładce do wykorzystania sesję bezpaństwowcem i nie robił żadnej różnicy naprawdę. Częścią problemu jest to, że jest to aplikacja typu brownfield i nie mam opcji generowania tożsamości. Czy istnieje sposób zmuszenia NH do wykonania wstawki bez żądania tożsamości zakresu podczas wstawiania rekordu? –

+1

Nota prawna: jest sposób, aby NHibernate zrobił wszystko, co tylko chcesz. Ale w tym przypadku nie można zmienić modelu. Twierdzę, że NH nie jest właściwym narzędziem w tym przypadku. – hometoast

+1

Dzięki, taki wniosek doszedłem. Zapytałem konkretnie o tożsamość zakresu w innym pytaniu, na wypadek gdyby ktoś znał jakąkolwiek formę magii, którą mógłbym zastosować. –

Powiązane problemy