Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 24272|Απάντηση: 0

[Πηγή] Φρεάτιο πυρήνα EF: Το DbContextPool προκαλεί εξάντληση της σύνδεσης του χώρου συγκέντρωσης σύνδεσης βάσης δεδομένων

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 2019-11-18 14:41:59 | | |
Το DbContextPool είναι μια νέα δυνατότητα που εισήχθη στο ASP.NET Core 2.1 που εξοικονομεί τα γενικά έξοδα για τη δημιουργία μιας παρουσίας DbContext, αλλά υπάρχει ένα μικρό λάκκο κρυμμένο σε αυτό.
Πρόσφατα, ένα έργο ASP.NET Core εκτελούνταν συνεχώς για μια χρονική περίοδο και, στη συνέχεια, εμφανίστηκε ένα σφάλμα στα αρχεία καταγραφής ότι ο χώρος συγκέντρωσης συνδέσεων βάσης δεδομένων έφτασε τον μέγιστο αριθμό συνδέσεων:


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.
   στο System.Data.Common.ADP.ExceptionWithStackTrace(Εξαίρεση e)
Στην αρχή, νόμιζα ότι ήταν κάποιος κώδικας που έκανε το DbContext να απορριφθεί σωστά, αλλά δεν βρήκα καμία ένδειξη στον κώδικα. Αργότερα, δεν υπήρχε τίποτα άλλο να αμφισβητήσω, μόνο το DbContextPool, οπότε προσπάθησα να αφαιρέσω το DbContextPool, αλλά το σφάλμα εξαφανίστηκε. Προκλήθηκε πράγματι από το DbContextPool, αλλά αυτό που κάνει τους ανθρώπους να αναρωτιούνται είναι ότι το DbContextPool προοριζόταν αρχικά να εξοικονομήσει τα γενικά έξοδα δημιουργίας παρουσιών DbContext, οπότε πώς μπορεί να καταναλώσει περισσότερες συνδέσεις βάσης δεδομένων και το φορτίο αυτού του έργου είναι πολύ χαμηλό, πώς μπορεί να καταναλώσει ολόκληρη τη δεξαμενή συνδέσεων;
Μίλησα για αυτό το περίεργο πρόβλημα στην εβδομαδιαία συνάντηση σήμερα και μετά ξαφνικά σκέφτηκα ότι κάθε παρουσία DbContext θα καταλαμβάνει μια σύνδεση βάσης δεδομένων (SqlConnection) και όταν το DbContextPool δεν είναι ενεργοποιημένο, μόλις τελειώσει το αίτημα, η αντίστοιχη παρουσία DbContext θα απορριφθεί και η σύνδεση βάσης δεδομένων θα επανέλθει στο χώρο συγκέντρωσης σύνδεσης. Όταν χρησιμοποιείτε το DbContextPool, το DbContext δεν θα απορριφθεί, αλλά θα τοποθετηθεί ξανά στο DbContextPool μετά τη λήξη του αιτήματος και το DbContext θα τοποθετηθεί ξανά στη δική του ομάδα, πράγμα που σημαίνει ότι η αντίστοιχη σύνδεση βάσης δεδομένων δεν θα επιστραφεί στη δεξαμενή συνδέσεων στην οποία ανήκει. Κάθε DbContext στο DbContextPool αντιστοιχεί σε μια σύνδεση βάσης δεδομένων και για κάθε επιπλέον DbContext στο DbContextPool, θα υπάρχει μία λιγότερη σύνδεση βάσης δεδομένων στο χώρο συγκέντρωσης συνδέσεων βάσης δεδομένων. Όταν οι δύο ομάδες είναι διαφορετικών μεγεθών και το DbContextPool είναι μεγαλύτερο από το χώρο συγκέντρωσης σύνδεσης της βάσης δεδομένων, προκύπτει το πρόβλημα, το DbContextPool γεμίζει ελεύθερα το DbContext στο χώρο συγκέντρωσης ανάλογα με το μέγεθος του δικού του χώρου συγκέντρωσης (ας υποθέσουμε ότι είναι 128), αγνοώντας το μέγεθος του χώρου συγκέντρωσης σύνδεσης βάσης δεδομένων (υποθέτοντας ότι είναι 100) και το παραπάνω σφάλμα θα προκύψει όταν συμπληρωθεί το 101ο DbContext.
Αυτό το έργο χρησιμοποιεί προεπιλεγμένες ρυθμίσεις, η προεπιλεγμένη ρύθμιση προκαλεί αυτό το πρόβλημα;

Εξετάζοντας τον πηγαίο κώδικα υλοποίησης DbContextPool, το προεπιλεγμένο όριο μεγέθους για το χώρο συγκέντρωσης εντοπισμού είναι 128


Κοιτάζοντας τον πηγαίο κώδικα υλοποίησης του SqlConnention, θα διαπιστώσετε ότι το προεπιλεγμένο όριο μεγέθους για τους χώρους συγκέντρωσης σύνδεσης είναι 100

Η προεπιλεγμένη ρύθμιση θα προκαλέσει το πρόβλημα, το οποίο είναι πραγματικά μια μικρή παγίδα.

Γνωρίζοντας τον λόγο, η λύση είναι απλή, ορίστε το poolSize του DbContextPool σε μικρότερο από το Max_Pool_Size του χώρου συγκέντρωσης σύνδεσης βάσης δεδομένων





Παρτιτούρα

Αριθμός συμμετεχόντων1ΜΒ+1 συνεισφέρω+1 Κατάρρευση λόγος
Ζμόλι775 + 1 + 1 Πάτα στο λάκκο και πάτησέ το +1

Δείτε όλες τις αξιολογήσεις





Προηγούμενος:Η C# κληρονομεί τον προσδιορισμό των IsAssignableFrom, IsSubclassOf
Επόμενος:Λύση εξαίρεσης MySQL Entity Framework Core
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com