NHibernate jest Flush: gdzie i kiedy go używać i dlaczego?

Jedną z rzeczy, które mnie całkowicie mylą, jest użycie session.Flush, w połączeniu z session.Commit i session.Close.

Czasami session.Close działa, np. zatwierdza wszystkie potrzebne mi zmiany. Wiem, że muszę użyć commit, gdy mam transakcję lub jednostkę pracy z kilkoma utworami / aktualizacjami/usunięciami, aby móc wycofać się, jeśli wystąpi błąd.

Ale czasami naprawdę denerwuje mnie logika za session.Flush. Widziałem przykłady, gdzie masz session.SaveOrUpdate() po którym następuje kolor, ale kiedy usuwam spłukać to działa dobrze i tak. Czasami napotykam błędy na instrukcji Flush, mówiącej, że czas sesji się skończył, a usunięcie go upewniło się, że nie napotkałem tego błędu.

Czy ktoś ma dobre wytyczne, gdzie i kiedy używać koloru? Sprawdziłem dokumentację NHibernate, ale nadal nie mogę znaleźć prostej odpowiedzi.

Author: geo, 2008-09-04

4 answers

Krótko:

  1. Zawsze używaj transakcji
  2. nie używaj Close(), zamiast tego zawiń swoje wywołania na ISession wewnątrz using lub Zarządzaj cyklem życia swojego ISession gdzie indziej .

From the documentation:

Od czasu do czasu ISession wykona polecenia SQL potrzebne do synchronizacji ADO.NET stan połączenia ze stanem obiektów przechowywanych w pamięci. Ten proces, flush, występuje domyślnie w następujące punkty

  • z niektórych inwokacji Find() lub Enumerable()
  • od NHibernate.ITransaction.Commit()
  • z ISession.Flush()

Polecenia SQL są wydawane w następującej kolejności

  1. Wszystkie wstawki encji, w tej samej kolejności odpowiednie obiekty zostały zapisane za pomocą ISession.Save()
  2. wszystkie aktualizacje entity
  3. Wszystkie skasowania kolekcji
  4. Wszystkie usunięcia elementów kolekcji, aktualizacje i wstawiania
  5. cała kolekcja insertions
  6. Wszystkie usunięcia encji, w tej samej kolejności odpowiednie obiekty zostały usunięte za pomocą ISession.Delete()

(wyjątek polega na tym, że obiekty wykorzystujące natywne generowanie ID są wstawiane podczas zapisywania.)

Nie ma absolutnie żadnych gwarancji co do tego, kiedy sesja wykona ADO.NET wywołania, tylko kolejność w jakiej są wykonywane . Jednak NHibernate gwarantuje, że metody ISession.Find(..) nigdy zwróci nieaktualne dane; nie zwróci też błędnych danych.

Można zmienić domyślne zachowanie tak, aby kolor występował rzadziej. Klasa FlushMode definiuje trzy różne tryby: tylko flush w czasie zatwierdzania (i tylko wtedy, gdy używane jest API NHibernate ITransaction), flush automatycznie przy użyciu wyjaśnionej procedury lub never flush, chyba że Flush() jest wywołana jawnie. Ostatni tryb jest przydatny dla długich jednostek pracy, gdzie ISession jest otwarty i odłączony przez długi czas czas.

...

Zobacz także tę sekcję :

Zakończenie sesji składa się z czterech odrębnych faz:

  • flush the session
  • Zatwierdź transakcję
  • Zamknij sesję
  • obsługa wyjątków

Flushing the Session

Jeśli zdarzy ci się używać API ITransaction, nie musisz się martwić o ten krok. Zostanie wykonana w sposób niejawny, gdy transakcja zostanie zaangażowana. W przeciwnym razie należy wywołać ISession.Flush(), aby upewnić się, że wszystkie zmiany są zsynchronizowane z bazą danych.

Zatwierdzanie transakcji bazy danych

Jeśli używasz API ITransaction NHibernate, wygląda to następująco:

tx.Commit(); // flush the session and commit the transaction

Jeśli zarządzasz ADO.NET transakcje samodzielnie należy ręcznie Commit() ADO.NET transakcja.

sess.Flush();
currentTransaction.Commit();

Jeśli zdecydujesz się nie zatwierdzać zmian:

tx.Rollback();  // rollback the transaction

Lub:

currentTransaction.Rollback();

Jeśli wycofaj transakcję należy natychmiast zamknąć i odrzucić bieżącą sesję, aby upewnić się, że wewnętrzny stan NHibernate jest spójny.

Zamknięcie Izesji

Wezwanie do ISession.Close() oznacza koniec sesji. Główną implikacją Close() jest to, że ADO.NET połączenie zostanie przerwane przez sesję.

tx.Commit();
sess.Close();

sess.Flush();
currentTransaction.Commit();
sess.Close();

Jeśli podałeś własne połączenie, Close() zwraca odniesienie do niego, więc możesz ręcznie zamknąć je lub zwrócić do puli. W przeciwnym razie Close() zwraca go do puli.

 229
Author: Matt Hinze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-12 13:53:38

Począwszy od NHibernate 2.0, transakcje są wymagane dla operacji DB. Dlatego wywołanie ITransaction.Commit() zajmie się każdym koniecznym spłukiwaniem. Jeśli z jakiegoś powodu nie używasz transakcji NHibernate, nie będzie automatycznego płukania sesji.

 13
Author: Sean Carpenter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-04 17:17:08

Od czasu do czasu ISession wykona polecenia SQL potrzebne do synchronizacji ADO.NET stan połączenia ze stanem obiektów przechowywanych w pamięci.

I Zawsze używaj

 using (var transaction = session.BeginTransaction())
 {
     transaction.Commit();
 }

Po zatwierdzeniu zmian niż te zmiany do zapisania w bazie danych używamy transakcji.Commit ();

 1
Author: ganders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-22 15:59:28

Oto dwa przykłady mojego kodu, gdzie nie powiedziełby się bez sesji.Flush ():

Http://www.lucidcoding.blogspot.co.uk/2012/05/changing-type-of-entity-persistence.html

Na końcu tego możesz zobaczyć sekcję kodu, w której ustawiam identity insert na, zapisuję encję, następnie flush, a następnie set identity insert off. Bez tego koloru wydawało się, że ustawia i wyłącza insert tożsamości, a następnie zapisuje encję.

Użycie Flush () dało mi większą kontrolę nad co się działo.

Oto kolejny przykład:

Wysyłanie wiadomości NServiceBus wewnątrz TransactionScope

Nie do końca rozumiem, dlaczego na tym, ale Flush () zapobiegł mojemu błędowi.

 0
Author: Paul T Davies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:55