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.
4 answers
Krótko:
- Zawsze używaj transakcji
- nie używaj
Close()
, zamiast tego zawiń swoje wywołania naISession
wewnątrzusing
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()
lubEnumerable()
- od
NHibernate.ITransaction.Commit()
- z
ISession.Flush()
Polecenia SQL są wydawane w następującej kolejności
- Wszystkie wstawki encji, w tej samej kolejności odpowiednie obiekty zostały zapisane za pomocą
ISession.Save()
- wszystkie aktualizacje entity
- Wszystkie skasowania kolekcji
- Wszystkie usunięcia elementów kolekcji, aktualizacje i wstawiania
- cała kolekcja insertions
- 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 NHibernateITransaction
), flush automatycznie przy użyciu wyjaśnionej procedury lub never flush, chyba żeFlush()
jest wywołana jawnie. Ostatni tryb jest przydatny dla długich jednostek pracy, gdzieISession
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 razieClose()
zwraca go do puli.
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.
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 ();
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.
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