Cuando se aprenden de las buenas practicas en el uso de recursos de sistema siempre se escuchan detalles generales como "siempre que usas una conección a la base de datos debes cerrarla". El asunto de esto es que hacerlo sin saber porque nos crea muchas pregunta en la cabeza que nos darán muchas vueltas y dudas, hasta que olvidamos y no lo hacemos porque nuestra mente trabaja justificando todo siempre, sino ahy justificación la mente no lo tiene en cuenta.
Ahora bien en este arítculo que no extenderé tanto voy a ir al grano sobre esta buena práctica. Primero hablaré sobre como se implementan las conecciones dentro de el ADO.NET.
ADO.NET implementa un nuevo modo de manejo de las conecciones conocido en ingles como CONNECTION POOLING pero que nos referiremos en este artículo como Grupos de Conecciones. Los grupos de conecciones es el encargado de manejar las conecciones. El mito conocido es que si abro una conección y la cierro esto desaparece de la base de datos Sql Server, lo cierto es que los Grupos de Conecciones de el ADO.NET no hace eso, lo siento pero es la verdad.
El modo de trabajar es totalmente diferente, cuando uno abre una conección a una base de datos por medio de una cadena de conección el ADO.NET primero verifica si tiene algún grupo de conecciones existente sino tiene crea uno, luego abre un objeto conección con un key único basado en la cadena de conección, dominio, proceso y si fuese el caso que se use seguridad integrada también incluye la identidad de Windows.
Le meta de el grupo de conecciones es tener un mejor control de las conecciones y no abrir conecciones no necesarias si el ya tiene una conección previa que pueda usarse. Esto sucede porque al abrir una conección el grupo de conecciones se lo da al ADO.NET y cuando se deje de usar esta conección entonces regresa a el grupo de conecciones para su re-uso.
Debido a como trabaja el grupo de conecciones es entonces que viene el porque de cerrar la conección. Microsoft define muy bien todo el proceso pero cuando un grupo le pasa una conección a el ADO.NET por medio de Open() si uno no cierra la conección entonces esta conección no podrá ser re-usada porque lo único que hace que la conección regrese al grupo es que se cierre con Close() ó Dipose(). Mientras más rápido se libere la conección mejor será porque podrá ser usada por otro proceso.
Pongamos un ejemplo de un sitio web para ventas de productos, por cada llamado de productos, datos de usuarios, información general y estadísticas de el sitio se hacen muchisimas consulta a la base de datos. un grupo de conecciones por defecto permite 100 conecciones y si se llega al límite se creará otro grupo. Si una conección en un web de este tipo no es cerrada no estará disponible para ser usada denuevo y se deberá crear una nueva conección lo que saturará todo y el sitio caera notablemente hasta que se reinicie el IIS y se liberen los grupos.
Pero si nosotros cerramos la conección lo más rapido que se pueda en el código trataremos que siempre se tenga un objeto conección disponible en el grupo de conecciones para cualquier otro proceso. Así siempre tendremos pocas conecciones y el sitio siempre estará bien. Lo mejor es que si se abrierón 10 conecciones en un momento por mucha actividad de clientes y la actividad baja después entonces solo se usarán por ejemplo 5 conecciones y después de cierto tiempo las 5 conecciones restantes por no ser usadas por un tiempo largo el grupo de conecciones las cierra.
Aquí les dejo la página de Microsoft que habla mucho de esto dando consejos de situaciones para que vean más a fondo el porque. Yo aquí explique todo en un modo entendible sin tanto ruedo para poder ampliarles las buenas costumbres.
http://msdn.microsoft.com/es-es/library/8xx3tyca.aspx
También dejo este Arítculo en inglés que brinda un proyecto que te hará ver las conecciones abiertas según varios escenarios.
http://www.pythian.com/news/1270/sql-server-understanding-and-controlling-connection-pooling-fragmentation
Espero disfruten el conocimiento y lo sigan trasmitiendo a los nuevos programadores.
Tags: