lunes, 8 de septiembre de 2008

Connection Pooling

En todo el tiempo que llevo dedicándome a la informática he trabajado o he visto de cerca muchos tipos de proyectos y de muy diversa índole, pero casi todos ellos compartian una misma característica: El acceso a datos. En este post voy a tratar de explicar en 4 pinceladas en que consiste el mecanismo de pooling de conexiones, algo que a pesar de estar totalmente extendido (de echo productos cómo ADO.Net para SQLServer lo utilizan de forma predeterminada) a mucha gente le es desconocido, a pesar de que seguramente lo llevan utilizándo

El mecanismo de pooling ,resumiendolo al máximo, consiste en mantener un conjunto de conexiones a la base de datos ya precreadas y listas para ser reutilzadas en las diferentes consultas sobre la base de datos.

¿Y que ganamos haciendo esto? Crear una conexión es caro, es necesario que la aplicación se conecte al servidor, se autentique el usuario y se devuelva una conexión válida. Con el mecanismo de pooling nos ahorramos la mayor parte de este proceso, ya que la conexión y la autenticación se relizan una única vez para todas las conexiones del pool. Esto es así porque el pooling se crea por cada string de conexión diferente que haya en la aplicación. Si tenemos, por ejemplo, dos cadenas de conexión diferentes, se crearà un pooling para cada una.

Para usar el pooling simplemente hay que indicar en el connection string que se quiere utilizar. De hecho en la mayoria de drivers de acceso a datos viene activado por defecto y lo que hay que indicar es que no se quiere usar.

Otras cosas a tener en cuenta al usar el pooling de conexiones és que estas se añaden al pooling de la siguiente manera:

  • Al crear la conexión se añaden al pooling el número de conexiones necesarias para llegar al valor de mínimas conexiones del pooling.
  • Cada vez que se abre una conexión, si hay alguna libre en el pooling se utiliza esa. Sinó se crea una nueva, siempre que no se haya llegado al número máximo de conexiones del pooling.
  • Al hacer el Close() de la conexión, esta se devuelve al pooling.
  • Las conexiones que estan en el pooling pueden ser eliminadas del mismo si pasa cierto tiempo sin que nadie las usa (normalmente se establece este tiempo con una propiedad llamada ConnectionLifeTime)

Un punto importante que se deriva de lo descrito en estas lineas, es que para el mejor funcionamiento del pooling, las conexiones se deben abrir lo más tarde posible y se deben cerrar lo antes posible después de ejecutar la transacción contra la base de datos.

Basicamente este seria al funcionamiento de un pooling de conexiones. ¿És conveniente utilizarlo? Todo depende del tipo de sistema que se esté implementando, pero en entornos multithreading (por ejemplo aplicaciones web, servicios con acceso a datos...) donde muchas conexiones son utilizadas de manera concurrente para acceder a los datos se puede aumentar considerablemente la peformance del servidor.


En los siguientes enlaces podreis profundizar más en el tema del pooling de conexiones:

Connection Pooling en la Wikipedia

Connection Pooling en SQLServer .Net Data Provider








No hay comentarios: