Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 24272|Răspunde: 0

[Sursă] Groapa EF Nucleu: DbContextPool cauzează epuizarea conexiunii pool-ului de baze de date

[Copiază linkul]
Postat pe 2019-11-18 14:41:59 | | |
DbContextPool este o funcționalitate nouă introdusă în ASP.NET Core 2.1 care economisește costul creării unei instanțe DbContext, dar există o mică groapă ascunsă în ea.
Recent, un proiect ASP.NET Core a rulat continuu o perioadă de timp, iar apoi a apărut o eroare în jurnale că pool-ul de conexiuni de baze de date a atins numărul maxim de conexiuni:


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.
   la System.Data.Common.ADP.ExceptionWithStackTrace(Exception e)
La început, am crezut că e vorba de un cod care a făcut ca DbContext să se arunce corect, dar nu am găsit niciun indiciu în cod. Mai târziu, nu mai era nimic de pus la îndoială, doar DbContextPool, așa că am încercat să elimin DbContextPool, dar eroarea a dispărut. A fost într-adevăr cauzat de DbContextPool, dar ceea ce îi face pe oameni să se întrebe este că DbContextPool a fost inițial conceput pentru a economisi costul creării instanțelor DbContext, deci cum poate consuma mai multe conexiuni de baze de date, iar încărcarea acestui proiect este foarte mică, cum poate consuma întregul pool de conexiuni?
Am vorbit despre această problemă ciudată la întâlnirea săptămânală de astăzi, iar apoi m-am gândit brusc că fiecare instanță DbContext va ocupa o conexiune la baza de date (SqlConnection), iar când DbContextPool nu este activat, imediat ce cererea se termină, instanța corespunzătoare DbContext va fi eliminată, iar conexiunea cu baza de date va fi pusă înapoi în pool-ul de conexiuni. Când se folosește DbContextPool, DbContextul nu va fi eliminat, ci va fi plasat înapoi în DbContextPool după încheierea cererii, iar DbContextul va fi plasat înapoi în propriul său pool, ceea ce înseamnă că conexiunea corespunzătoare la baza de date nu va fi returnată în pool-ul de conexiuni căruia îi aparține. Fiecare DbContext din DbContextPool corespunde unei conexiuni la baza de date, iar pentru fiecare DbContext suplimentar din DbContextPool, va exista o conexiune de bază de date mai puțin în pool-ul de conexiuni la baza de date. Când cele două pool-uri au dimensiuni diferite și DbContextPool este mai mare decât pool-ul de conexiuni la baza de date, apare problema: DbContextPool completează liber DbContext în pool în funcție de mărimea propriului său pool (să zicem că este 128), ignorând dimensiunea pool-ului de conexiune la bază de date (presupunând că este 100), iar eroarea de mai sus va apărea când al 101-lea DbContext este complet.
Acest proiect folosește setări implicite, configurarea implicită declanșează această problemă?

Privind codul sursă al implementării DbContextPool, limita implicită de dimensiune pentru pool-ul de descoperiri este 128


Uitându-te la codul sursă de implementare al SqlConnention, vei observa că limita implicită de dimensiune pentru pool-urile de conexiuni este 100

Setarea implicită va declanșa problema, ceea ce este de fapt o mică capcană.

Știind motivul, soluția este simplă: setează poolSize al DbContextPool la mai mică decât Max_Pool_Size pool-ului de conexiuni la bază de date





Scor

Numărul participanților1MB+1 Contribui+1 Colaps rațiune
Zmoli775 + 1 + 1 Calcă pe groapă și calcă pe ea +1

Vezi toate ratingurile





Precedent:C# moștenește determinarea IsAssignableFrom, IsSubclassOf
Următor:MySQL Entity Framework Core soluție de ocolire pentru excepții
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com