Resumen Hoy voy a hablar sobre los pools de conexiones de bases de datos. Para ser sincero, dije que la pera de pato es muy grande. Porque los pools de conexiones son relativamente difíciles de entender en comparación con otros capítulos. Quiero explicártelo con las frases más populares, pero no es una tarea fácil. Sin embargo, los pools de conexiones también son un punto de conocimiento muy importante, especialmente al desplegar programas multiusuario. Por lo tanto, no solo tengo que hablar, sino también hablar a fondo. A través de este artículo, entenderás los fundamentos del pooling de conexiones y cómo ya se aprovecha para mejorar el rendimiento de tu aplicación.
Índice ¿Qué es un pool de conexiones? Cómo funciona el pool de conexiones Hablemos de algunas propiedades muy importantes de los pools de conexiones Excepciones del pool de conexiones y métodos de manejo Una forma de monitorizar el estado de tu conexión Principios básicos para un uso eficiente de pools de conexiones 1. ¿Qué es un pool de conexiones? En el artículo anterior, "ADO.NET Debes Conocer (4) Objetos de Conexión de Sabor", he enfatizado que establecer una conexión a una base de datos es algo que consume mucho tiempo (tiempo) y que requiere mucho trabajo (que consume recursos). Esto se debe a que conectarse a un servidor de base de datos implica varios procesos largos: establecer un canal físico (como un socket o una tubería con nombre), realizar un handshake inicial con el servidor, analizar la información de la cadena de conexión, hacer que el servidor autentique la conexión, realizar una comprobación para registrar la transacción actual, y así sucesivamente. Independientemente de por qué existe tal mecanismo, siempre hay una razón para existir. Si crear una nueva conexión es tan dolorosa, ¿por qué no reutilizar una que ya tenía?
De hecho, ADO.NET ya nos da un método de optimización llamado agrupación de conexiones. Un pool de conexiones es uno de esos contenedores: alberga un cierto número de conexiones físicas al servidor de base de datos. Por lo tanto, cuando necesitamos conectarnos al servidor de base de datos, solo necesitamos eliminar una conexión libre del pool (contenedor) en lugar de crear una nueva. Esto reduce considerablemente la sobrecarga de conectarse a la base de datos, lo que mejora el rendimiento de la aplicación.
PS:本来做了2张图片来描述连接池的,无奈公司装有监控软件,不能上传,所以只能等下次有时间上传了。
2. Cómo funciona el pool de conexiones 2.1 Crear un pool de conexiones Cabe señalar que los pools de conexiones son sensibles a clases. Es decir, el mismo dominio de aplicación puede tener varios tipos diferentes de pools de conexión al mismo tiempo. Entonces, ¿cómo se identifican los pools de conexión? En detalle, se distingue por la firma que forma el proceso, el dominio de aplicación, la cadena de conexión y la identidad de Windows (cuando se utiliza seguridad integrada). Sin embargo, para el mismo dominio de aplicación, generalmente solo se identifica por la cadena de conexión. Cuando se abre una conexión, se crea un nuevo pool de conexiones si la firma de tipo de la conexión strip no coincide con el tipo del pool de conexiones existente. de lo contrario, no se crea ningún nuevo pool de conexiones.
Un ejemplo típico de cómo crear una conexión:
En el caso anterior, creé tres objetos SqlConnection, pero solo se necesitaban dos pools de conexiones para gestionarlos. Cuidado, amigos, puede que ya hayáis descubierto que conn1 y conn3 tienen la misma cadena de conexión, así que pueden compartir un conjunto de conexiones, mientras que conn2 y conn1 son diferentes de conn3, así que necesitas crear un nuevo conjunto de conexiones.
2.2 Asignación de conexiones en reposo Cuando un usuario crea una solicitud de conexión o llama a la Apertura de un objeto de conexión, el gestor del pool de conexiones primero debe encontrar un pool de conexión del tipo correspondiente basado en la firma de tipo de la solicitud de conexión, y luego intentar asignar una conexión libre. Los detalles son los siguientes:
Si hay una conexión disponible en el pool, devuelve la conexión. Si todas las conexiones de la piscina están agotadas, crea una nueva conexión para añadir a la piscina. Si se ha alcanzado el número máximo de conexiones en el pool, la solicitud entra en la cola de espera hasta que haya conexiones libres disponibles. 2.3 Eliminar conexiones inválidas Conexiones inválidas, es decir, conexiones que no se conectan correctamente al servidor de la base de datos. Para los pools de conexión, el número de conexiones almacenadas en el servidor de base de datos es limitado. Por lo tanto, si las conexiones inválidas no se eliminan en el tiempo, se desperdiciará espacio en el conjunto de conexiones. De hecho, no tienes que preocuparte, el gestor del pool de conexiones ha gestionado estos problemas muy bien por nosotros. Si una conexión permanece inactiva durante un periodo prolongado, o si detecta que la conexión al servidor está desconectada, el gestor del pool de conexiones elimina la conexión del pool.
2.4 Reciclaje de conexiones usadas Cuando terminemos de usar una conexión, deberíamos cerrarla o soltarla a tiempo para que la conexión pueda volver a la piscina para su reutilización. Podemos cerrar la conexión mediante el método Close o Dispose del objeto Connection, o mediante la sentencia using en C#.
3. Cuéntame algunos atributos muy importantes El comportamiento del conjunto de conexiones puede controlarse mediante cadenas de conexión e incluye principalmente cuatro propiedades importantes:
Tiempo de espera de la conexión: El tiempo para que la solicitud de conexión espere un tiempo de espera. El valor por defecto es 15 segundos en segundos. Tamaño máximo del pool: El número máximo de conexiones en el pool. El valor por defecto es 100. Tamaño mínimo del pool: El número mínimo de conexiones en el pool. El valor predeterminado es 0.
Pooling: 是否启用连接池。ADO.NET默认是启用连接池的,因此,你需要手动设置Pooling=false来禁用连接池。 Tomemos un ejemplo para entender las propiedades del pool de conexiones. El código es el siguiente:
4. Excepciones del pool de conexiones y métodos de manejo Cuando un usuario abre una conexión sin cerrarla correctamente o a tiempo, a menudo se desencadena el problema de la "fuga de conexión". La conexión con fuga permanece abierta hasta que se llama al método de Eliminación, y el recolector de basura (GC) cierra y libera la conexión. A diferencia de ADO, ADO.NET necesitas cerrar manualmente las conexiones usadas. Un mito importante es que la conexión se cierra cuando el objeto conectado está fuera del alcance local. De hecho, cuando está fuera de alcance, solo se libera el objeto de conexión, no el recurso de conexión. Bueno, veamos primero un ejemplo.
Para que los resultados sean más evidentes, pongo especialmente el número máximo de conexiones en 5 y el tiempo de espera es de 1 segundo. Después de correr, se obtienen rápidamente los siguientes resultados.
A partir de los resultados anteriores, está claro que hay una anomalía en la conexión. Ya sabemos que el número máximo de conexiones en el pool de conexiones es 5, y cuando se crea la sexta conexión, es necesario esperar hasta que se agote porque el número máximo de conexiones en el pool de conexiones ha alcanzado el número máximo y no hay conexiones libres. Cuando se exceda el tiempo de espera, aparecerá la excepción de conexión mencionada anteriormente. Por lo tanto, debo enfatizar una vez más que las conexiones usadas deben cerrarse y liberarse correctamente lo antes posible.
5. Métodos para monitorizar el estado de las conexiones SQL Server (1) A través del monitor de actividad Paso 1: Abre el Administrador de MSSMS y haz clic en el icono "Monitor de actividad".
Paso 2: En la vista Monitor de Actividad Abierto, haz clic en la pestaña Procesos.
Paso 3: Ejecuta el ejemplo en #4 Excepciones y Métodos de Manejo de Pool de Conexiones, puedes ver las 5 conexiones abiertas como se muestra en la figura de abajo.
(2) Utilizar sentencias T-SQL Del mismo modo, ejecutando el procedimiento almacenado del sistema sp_who también podemos monitorizar el estado de la conexión.
6. Principios básicos para un uso eficiente de pools de conexiones Aprovechar bien el pool de conexiones mejorará enormemente el rendimiento de tu aplicación. Al contrario, si se usa incorrectamente, no causará ningún daño. En general, deben seguirse los siguientes principios:
Solicita una conexión en el último momento, suelta la conexión lo antes posible. Cuando cierres la conexión, cierra primero la transacción definida por el usuario correspondiente. Asegúrate y mantén al menos una conexión abierta en el conjunto de conexiones. Intenta evitar los restos de la piscina. Esto incluye principalmente la fragmentación de pools generada por seguridad integrada y la fragmentación de pools generada por el uso de muchas bases de datos. Consejo: La fragmentación de pools es un problema común en muchas aplicaciones web, y las aplicaciones pueden crear un gran número de pools que no se liberan hasta que el proceso termina. De este modo, se abrirán un gran número de conexiones, ocupando mucha memoria y reduciendo el rendimiento.
|