Struktura podmiotu i łączenie Pooling

Ostatnio zacząłem używać Entity Framework 4.0 w mojej aplikacji. NET 4.0 i jestem ciekawy kilku rzeczy związanych z poolingiem.

  1. Connection pooling jak Wiem jest zarządzany przez ADO.NET Data provider, w moim przypadku MS SQL server. Czy ma to zastosowanie, gdy tworzysz nowy kontekst encji (ObjectContext), tzn. bez parametru new MyDatabaseModelEntities()?

  2. Jakie są zalety i wady a) tworzenia globalnego kontekstu podmiotów dla aplikacja (tj. jedna statyczna instancja) lub b) tworząca i eksponująca kontekst encji dla każdej podanej operacji/metody, z blokiem using.

  3. Jakieś inne zalecenia, najlepsze praktyki lub wspólne podejście do pewnych scenariuszy, o których powinienem wiedzieć?

Author: Noldorin, 2010-09-06

4 answers

  1. łączenie połączeń jest traktowane jak w każdym innym ADO.NET podanie. Encja connection nadal używa tradycyjnego połączenia z bazą danych z tradycyjnym ciągiem połączeń. Wierzę, że możesz wyłączyć łączenie połączeń w łańcuchu połączeń, jeśli nie chcesz go używać. (read more about SQL Server Connection Pooling (ADO.NET))
  2. nigdy nie używaj globalnego kontekstu. ObjectContext wewnętrznie implementuje kilka wzorców, w tym mapę tożsamości i jednostkę pracy. Wpływ stosowania kontekst globalny różni się w zależności od typu aplikacji.
  3. dla aplikacji internetowych użyj pojedynczego kontekstu na żądanie. W przypadku usług internetowych użyj pojedynczego kontekstu na połączenie. W aplikacjach WinForms lub WPF użyj jednego kontekstu dla formularza lub dla prezentera. Mogą istnieć pewne specjalne wymagania, które nie pozwolą na zastosowanie tego podejścia, ale w większości sytuacji to wystarczy.

Jeśli chcesz wiedzieć, jaki wpływ ma kontekst pojedynczego obiektu dla aplikacji WPF / WinForm, sprawdź ten Artykuł. On o sesji NHibernate, ale pomysł jest taki sam.

Edit:

Gdy używasz EF, domyślnie ładuje każdy element tylko raz na kontekst. Pierwsze zapytanie tworzy obiekt instace i przechowuje go wewnętrznie. Każde kolejne zapytanie, które wymaga encji z tym samym kluczem, zwraca tę przechowywaną instancję. Jeśli wartości w magazynie danych ulegną zmianie, nadal otrzymasz element z wartościami z początkowego zapytania. To się nazywa wzór Mapy tożsamości . Możesz wymusić obiekt kontekst do przeładowania encji, ale przeładuje pojedynczą współdzieloną instancję.

Wszelkie zmiany wprowadzone w encji nie są utrzymywane, dopóki nie zadzwonisz SaveChanges w kontekście. Możesz wprowadzać zmiany w wielu obiektach i przechowywać je jednocześnie. To się nazywa Jednostka wzorca pracy . Nie można selektywnie powiedzieć, który zmodyfikowany dołączony obiekt chcesz zapisać.

Połącz te dwa wzory, a zobaczysz ciekawe efekty. Masz tylko jedną instancję encji dla całej podanie. Wszelkie zmiany w encji wpływają na całą aplikację, nawet jeśli zmiany nie zostały jeszcze wprowadzone (przyjęte). W większości przypadków to nie jest to, czego chcesz. Załóżmy, że masz Formularz edycji w aplikacji WPF. Pracujesz z podmiotem i decydujesz się anulować złożoną edycję (zmiana wartości, dodawanie powiązanych podmiotów, usuwanie innych powiązanych podmiotów itp.). Ale jednostka jest już zmodyfikowana we wspólnym kontekście. Co zrobisz? Podpowiedź: Nie wiem o żadnych CancelChanges lub UndoChanges on ObjectContext.

Myślę, że nie musimy omawiać scenariusza serwera. Po prostu dzielenie jednej jednostki między wieloma żądaniami HTTP lub połączeniami z usługami sieciowymi sprawia, że aplikacja jest bezużyteczna. Każde żądanie może po prostu wyzwolić SaveChanges i zapisać częściowe dane z innego żądania, ponieważ udostępniasz jedną jednostkę pracy między nimi wszystkimi. Będzie to miało również inny problem-kontekst i wszelkie manipulacje z encjami w kontekście lub połączenie z bazą danych używane przez kontekst nie jest wątkiem bezpiecznie.

Nawet dla aplikacji tylko do odczytu globalny kontekst nie jest dobrym wyborem, ponieważ prawdopodobnie potrzebujesz świeżych danych za każdym razem, gdy odpytywasz aplikację.

 373
Author: Ladislav Mrnka,
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-07-02 12:51:08

Według Daniela Simmonsa:

Tworzenie nowej instancji ObjectContext w Oświadczenie dotyczące korzystania z każdej usługi metoda tak, aby była usuwana zanim metoda powróci. Ten krok ma kluczowe znaczenie dla skalowalności usługi. Zapewnia, że połączenia z bazami danych nie są otwarte podczas wywołań usługowych i że tymczasowy stan używany przez daną operację jest zbierany po zakończeniu tej operacji. Struktura encji automatycznie buforuje metadane i inne informacje potrzebne w domenie aplikacji oraz ADO.NET grupuje połączenia baz danych, więc ponowne tworzenie kontekstu za każdym razem jest szybką operacją.

To z jego obszernego artykułu tutaj:

Http://msdn.microsoft.com/en-us/magazine/ee335715.aspx

Uważam, że ta rada rozciąga się na żądania HTTP, więc będzie ważna dla ASP.NET. stanowa aplikacja kliencka fat, taka jak aplikacja WPF, może być jedynym przypadkiem dla" współdzielonego " kontekstu.

 71
Author: Dave Swersky,
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
2010-09-06 16:53:31

Zgodność z dokumentacją EF6 (4,5) : https://msdn.microsoft.com/en-us/data/hh949853#9

9.3 Context per request

Konteksty Entity Framework mają być używane jako krótkotrwałe instancje w celu zapewnienia najbardziej optymalnej wydajności. Oczekuje się, że konteksty będą krótkotrwałe i odrzucone, a jako takie zostały wdrożone, aby były bardzo lekkie i wykorzystywały metadane w miarę możliwości. W scenariuszach internetowych jest ważne, aby mieć to na uwadze i nie mieć kontekstu dłużej niż czas trwania pojedynczego żądania. Podobnie, w scenariuszach innych niż internetowe, kontekst powinien zostać odrzucony na podstawie zrozumienia różnych poziomów buforowania w ramach jednostki. Ogólnie rzecz biorąc, należy unikać wystąpienia kontekstowego przez cały okres użytkowania aplikacji, a także kontekstów na wątek i kontekstów statycznych.

 14
Author: Raj Rao,
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
2016-09-09 23:20:07

Poniższy kod pomógł odświeżyć mój obiekt o nowe wartości bazy danych. Wpis(obiekt).Polecenie Reload() wymusza na obiekcie przypomnienie wartości bazy danych

GM_MEMBERS member = DatabaseObjectContext.GM_MEMBERS.FirstOrDefault(p => p.Username == username && p.ApplicationName == this.ApplicationName);
DatabaseObjectContext.Entry(member).Reload();
 1
Author: HGMamaci,
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-03-13 00:09:52