Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 24272|Respuesta: 0

[Fuente] Fit Core Pit: DbContextPool causa agotamiento de la conexión a la base de datos

[Copiar enlace]
Publicado el 18-11-2019 14:41:59 | | |
DbContextPool es una función nueva introducida en ASP.NET Core 2.1 que ahorra la carga de crear una instancia de DbContext, aunque hay un pequeño pozo oculto en ella.
Recientemente, un proyecto ASP.NET Core se ejecutó de forma continua durante un periodo de tiempo y luego apareció un error en los registros que indicaba que el pool de conexiones de la base de datos alcanzaba el número máximo de conexiones:


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.
   en System.Data.Common.ADP.ExceptionWithStackTrace(Exception e)
Al principio pensé que era algún código el que hacía que el DbContext se desechara correctamente, pero no encontré ninguna pista en el código. Más tarde, realmente no había nada más que dudar, solo DbContextPool, así que intenté eliminar DbContextPool, pero el error desapareció. Efectivamente fue causado por DbContextPool, pero lo que hace que la gente se pregunte es que DbContextPool estaba originalmente pensado para ahorrar la sobrecarga de crear instancias de DbContext, así que ¿cómo puede consumir más conexiones a la base de datos, y la carga de este proyecto es muy baja, cómo puede consumir todo el pool de conexiones?
Hablé de este extraño problema en la reunión semanal de hoy, y de repente pensé que cada instancia de DbContext ocupará una conexión a la base de datos (SqlConnection), y cuando DbContextPool no está habilitado, en cuanto termine la solicitud, la instancia correspondiente de DbContext se eliminará y la conexión a la base de datos se volverá a integrar en el pool de conexiones. Al usar DbContextPool, el DbContext no se elimina, sino que se coloca de nuevo en el DbContextPool una vez finalizada la solicitud, y el DbContext vuelve a estar en su propio pool, lo que significa que su conexión correspondiente a la base de datos no se devuelve al pool de conexiones al que pertenece. Cada DbContext en el DbContextPool corresponde a una conexión a la base de datos, y por cada DbContext adicional en el DbContextPool, habrá una conexión de base de datos menos en el conjunto de conexiones. Cuando los dos grupos tienen tamaños diferentes y el DbContextPool es más grande que el conjunto de conexiones de bases de datos, surge el problema: DbContextPool rellena libremente el DbContext en el pool según el tamaño de su propio pool (digamos que es 128), ignorando el tamaño del pool de conexión a la base de datos (suponiendo que es 100), y el error anterior ocurrirá cuando se llene el 101º DbContext.
Este proyecto usa la configuración predeterminada, ¿la configuración predeterminada desencadena este problema?

Al observar el código fuente de implementación de DbContextPool, el límite de tamaño por defecto para el pool de descubrimiento es 128


Al mirar el código fuente de implementación de SqlConnention, verás que el límite de tamaño por defecto para los pools de conexión es 100

La configuración por defecto activará el problema, que en realidad es un pequeño inconveniente.

Sabiendo la razón, la solución es sencilla: establecer el poolSize del DbContextPool a menor que el Max_Pool_Size del pool de conexiones de la base de datos





Puntuación

Número de participantes1MB+1 contribuir+1 Colapso razón
Zmoli775 + 1 + 1 Pisa el pozo y pisa el pozo +1

Ver todas las valoraciones





Anterior:C# hereda la determinación de IsAsignableDe, IsSubclaseDe
Próximo:Solución alternativa para excepciones del MySQL Entity Framework
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com