Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 24272|Odpowiedź: 0

[Źródło] EF Core pit: DbContextPool powoduje wyczerpanie połączenia z bazą danych

[Skopiuj link]
Opublikowano 2019-11-18 14:41:59 | | |
DbContextPool to nowa funkcja wprowadzona w ASP.NET Core 2.1, która oszczędza narzut związany z tworzeniem instancji DbContext, ale jest w niej ukryty mały otchód.
Niedawno projekt ASP.NET Core działał nieprzerwanie przez pewien czas, a następnie w logach pojawił się błąd, że pula połączeń bazy danych osiągnęła maksymalną liczbę połączeń:


System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
   at System.Data.Common.ADP.ExceptionWithStackTrace(Exception e)
Na początku myślałem, że to jakiś kod powoduje prawidłowe usuwanie DbContext, ale nie znalazłem żadnych wskazówek w kodzie. Później nie było już nic do podejrzeń, tylko DbContextPool, więc próbowałem usunąć DbContextPool, ale błąd zniknął. Rzeczywiście było to spowodowane przez DbContextPool, ale to, co budzi wątpliwości, to fakt, że DbContextPool pierwotnie miał oszczędzać narzut związany z tworzeniem instancji DbContext, więc jak może zużywać więcej połączeń bazowych i obciążenia tego projektu jest bardzo niskie, jak może pochłaniać całą pulę połączeń?
Mówiłem o tym dziwnym problemie na cotygodniowym spotkaniu dzisiaj, a potem nagle pomyślałem, że każda instancja DbContext zajmie połączenie bazy danych (SqlConnection), a gdy DbContextPool nie jest włączony, zaraz po zakończeniu żądania odpowiadający mu przypadek zostanie usunięty, a połączenie bazy danych zostanie ponownie umieszczone w puli połączeń. Podczas korzystania z DbContextPool DbContext nie zostanie usunięty, lecz zostanie umieszczony z powrotem do DbContextPool po zakończeniu żądania, a DbContext zostanie umieszczony z powrotem w swojej własnej puli, co oznacza, że odpowiadające mu połączenie bazy danych nie zostanie zwrócone do puli połączeń, do której należy. Każdy DbContext w DbContextPool odpowiada połączeniu bazy danych, a dla każdego dodatkowego DbContext w DbContextPool będzie o jedno mniej połączenia bazy danych w puli połączeń bazy danych. Gdy obie pule mają różne rozmiary, a DbContextPool jest większy niż pula połączeń bazy danych, pojawia się problem – DbContextPool swobodnie wypełnia DbContext do puli zgodnie z rozmiarem własnej puli (załóżmy, że wynosi 128), ignorując rozmiar puli połączeń bazy danych (zakładając, że wynosi 100), a powyższy błąd wystąpi po wypełnieniu 101. DbContext.
Ten projekt używa domyślnych ustawień, czy domyślne ustawienia wywołują ten problem?

Patrząc na kod źródłowy implementacji DbContextPool, domyślny limit rozmiaru puli odkrywania wynosi 128


Patrząc na kod źródłowy implementacji SqlConnention, zobaczysz, że domyślny limit rozmiaru pul połączeń wynosi 100

Domyślne ustawienie wywoła problem, co jest tak naprawdę drobną pułapką.

Znając powód, rozwiązanie jest proste – ustaw rozmiar puli DbContextPool na mniejszy niż Max_Pool_Size puli połączeń bazy danych





Wynik

Liczba uczestników1MB+1 przyczynić się+1 Zapaść powód
Zmoli775 + 1 + 1 Wdepnij na dół i wepnij na niego +1

Zobacz wszystkie oceny





Poprzedni:C# dziedziczy determinację IsAssignableFrom, IsSubclassOf
Następny:Obejście wyjątków Core w MySQL Entity Framework
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com