Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 24272|Válasz: 0

[Forrás] EF Core pit: DbContextPool az adatbázis-kapcsolati pool kapcsolatának kimerülését okozza

[Linket másol]
Közzétéve: 2019-11-18 14:41:59 | | |
A DbContextPool egy új funkció, amelyet ASP.NET Core 2.1-ben vezettek be, és amely megtakarítja a DbContext instance létrehozásának többletköltségeit, de egy kis gödör rejtőzik benne.
Nemrégiben egy ASP.NET Core projekt folyamatosan futott egy ideig, majd a naplókban hiba jelent meg, hogy az adatbázis kapcsolati pool elérte a maximális kapcsolatszámot:


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.
   a System.Data.Common.ADP.ExceptionWithStackTrace(Exception e) címen
Eleinte azt hittem, valami kód okozta a DbContext helyes eltüntetését, de nem találtam semmilyen nyomot a kódban. Később igazából nem volt más kételkednivaló, csak a DbContextPool, így megpróbáltam eltávolítani a DbContextPool-ot, de a hiba eltűnt. Valóban a DbContextPool okozta, de ami elgondolkodtatja az embereket, hogy a DbContextPool eredetileg a DbContext instance-ok létrehozásának többletterhelését akarja megtakarítani, szóval hogyan fogyaszthat több adatbázis-kapcsolatot, miközben a projekt terhelése nagyon alacsony, hogyan foghatja el az egész kapcsolati poolt?
Erről a furcsa problémáról beszéltem ma a heti értekezleten, majd hirtelen arra gondoltam, hogy minden DbContext példány egy adatbázis-kapcsolatot (SqlConnection) foglal el, és amikor a DbContextPool nincs engedélyezve, amint a kérés véget ér, a megfelelő DbContext példány megszabadul, és az adatbázis-kapcsolat visszakerül a kapcsolati oldalba. A DbContextPool használatakor a DbContext nem kerül eldobásra, hanem a kérés vége után visszakerül a DbContextPoolba, és a DbContext visszakerül a saját oldalába, ami azt jelenti, hogy a megfelelő adatbázis-kapcsolat nem kerül vissza abba a kapcsolati oldalba, amelyhez tartozik. Minden DbContext a DbContextPoolban egy adatbázis-kapcsolatnak felel meg, és minden további DbContext esetén a DbContextPoolban egy adatbázis-kapcsolat kevesebb lesz az adatbázis-kapcsoló poolban. Ha a két pool különböző méretű, és a DbContextPool nagyobb, mint az adatbázis kapcsolati pool, akkor felmerül a probléma, a DbContextPool szabadon tölti ki a DbContext-et a poolba a saját poolja mérete szerint (tegyük fel, hogy 128), figyelmen kívül hagyva az adatbázis-kapcsolat pool méretét (feltételezve, hogy 100), és a fenti hiba akkor következik be, amikor a 101. DbContext megtöltődik.
Ez a projekt alapértelmezett beállításokat használ, az alapértelmezett beállítás indítja ki ezt a problémát?

A DbContextPool megvalósítási forráskódját nézve a felfedező pool alapértelmezett méretkorlátja 128


Ha megnézzük a SqlConnention megvalósítási forráskódját, azt találhatod, hogy a kapcsolati poolok alapértelmezett méretkorlátja 100

Az alapértelmezett beállítás indítja el a problémát, ami igazából egy apró buktató.

Ismerve az okot, a megoldás egyszerű: állítsuk be a DbContextPool poolSize-ét kevesebbre, mint az adatbázis kapcsolati pool Max_Pool_Size





Pontszám

A résztvevők száma1MB+1 hozzájárul+1 Összeomlás ok
Zmoli775 + 1 + 1 Lépj a gödörre és lépj rá +1

Minden értékelés megtekintése





Előző:C# örökli az IsAssignableFrom, IsSubclassOf meghatározását
Következő:MySQL Entity Framework Core exception workaround
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com