Compartir a través de


Agrupación de conexiones para el proveedor de datos de .NET Framework para SQL Server

La agrupación de conexiones puede mejorar notablemente el rendimiento y la escalabilidad de una aplicación. El proveedor de datos de .NET Framework para SQL Server proporciona automáticamente el sistema de agrupación de conexiones a la aplicación cliente de ADO.NET. También puede proporcionar varios modificadores en la cadena de conexión para controlar el funcionamiento del sistema de agrupación de conexiones (vea la sección "Controlar la agrupación de conexiones mediante palabras reservadas de cadenas de conexión" más adelante en este tema).

Creación y asignación de agrupaciones

Al abrir una conexión, se crea una agrupación de conexiones basada en un preciso algoritmo de asociación que relaciona la agrupación con la cadena de conexión de esa conexión. Cada agrupación de conexiones se asocia a una cadena de conexión distinta. Cuando se abre una conexión nueva, si la cadena de conexión empleada no coincide exactamente con la de alguna de las agrupaciones existentes, se crea una agrupación nueva.

En el ejemplo siguiente se crean tres nuevos objetos SqlConnection, aunque sólo son necesarias dos agrupaciones de conexión para administrarlos. Observe que la primera y segunda cadenas de conexión sólo se diferencian en el valor asignado a Initial Catalog.

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();      
// Pool A is created.

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=pubs";
conn.Open();      
// Pool B is created because the connection strings differ.

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();      
// The connection string matches pool A.

Las agrupaciones de conexión creadas sólo se destruyen cuando finaliza el proceso activo. El mantenimiento de las agrupaciones de conexión inactivas o vacías supone una sobrecarga mínima para el sistema.

Adición de conexiones

Se crea una agrupación de conexiones para cada cadena de conexión distinta. Cuando se crea una agrupación, se crean varios objetos de conexión que se agregan a la agrupación con el fin de satisfacer los requisitos de tamaño mínimo de la agrupación. Las conexiones se van agregando a la agrupación cuando es necesario hasta que ésta alcanza su tamaño máximo.

Cuando se produce una solicitud de un objeto SqlConnection, se obtiene de la agrupación si hay una conexión útil disponible. Para que una conexión sea útil es necesario que no esté siendo utilizada, debe tener un contexto de transacción coincidente o no tener ninguno asociado con él, además de un vínculo válido con el servidor.

Cuando la agrupación alcanza su tamaño máximo y no queda ninguna conexión útil, la solicitud entra en una cola de espera. El agrupador de conexiones responde a esas solicitudes en espera mediante la reasignación de las conexiones que van quedando libres en la agrupación. Las conexiones quedan libres en la agrupación al llamar a Close o Dispose en el objeto Connection.

**PRECAUCIÓN   **Se recomienda cerrar siempre el objeto Connection cuando termine de utilizarlo a fin de devolver la conexión a la agrupación. Esta operación se puede realizar mediante los métodos Close o Dispose del objeto Connection. Es posible que las conexiones que no se cierran de forma explícita no se agreguen ni se devuelvan a la agrupación. Por ejemplo, una conexión que ha quedado fuera de ámbito pero que no se ha cerrado explícitamente sólo se devolverá a la agrupación de conexiones si se ha alcanzado el tamaño máximo de la agrupación y la conexión sigue siendo válida.

Nota   No llame a Close o Dispose en un objeto Connection, DataReader, o cualquier otro objeto administrado en el método Finalize de su clase. En un finalizador, libere sólo los recursos no administrados que pertenezcan directamente a su clase. Si la clase no dispone de recursos no administrados, no incluya un método Finalize en la definición de clase. Para obtener más información, vea Programar para la recolección de elementos no utilizados.

Eliminación de conexiones

El agrupador de conexiones quitará una conexión de la agrupación cuando se agote su período de conexión o cuando detecte que la conexión con el servidor se ha interrumpido. Tenga en cuenta que sólo se puede detectar esta interrupción al intentar comunicarse con el servidor. Si se encuentra una conexión que ya no está conectada al servidor, se marcará como no válida. El agrupador de conexiones examina periódicamente las agrupaciones de conexiones en busca de objetos que se hayan liberado en la agrupación y que estén marcados como no válidos. Esas conexiones se quitan de forma permanente.

Si se encuentra una conexión a un servidor que ha desaparecido, es posible que se elimine de la agrupación incluso en el caso de que el agrupador de conexiones no haya detectado la interrupción de la conexión y no la haya marcado, por tanto, como no válida. Cuando se da este hecho, se inicia una excepción. Sin embargo, debe cerrar la conexión para liberarla en la agrupación.

Compatibilidad con transacciones

Las conexiones se obtienen de la agrupación y se asignan en función del contexto de la transacción. El contexto del subproceso que efectúa la solicitud debe coincidir con el de la conexión asignada. Por eso, cada agrupación de conexiones está realmente dividida en conexiones, que no tienen ningún contexto de transacción asociado, y en N subdivisiones que contienen conexiones con un contexto de transacción en particular.

Al cerrar una conexión, ésta se libera en la agrupación y dentro de la subdivisión correspondiente en función de su contexto de transacción. Por tanto, puede cerrar la conexión sin generar ningún error, incluso en el caso de que una transacción distribuida quede aún pendiente. De esta forma, posteriormente puede confirmar o anular la transacción distribuida.

Controlar la agrupación de conexiones por medio de palabras clave de cadena de conexión

La propiedad ConnectionString del objeto SqlConnection permite usar pares de clave y valor de cadena de conexión que sirven para modificar el comportamiento del sistema de agrupación de conexiones.

En la tabla siguiente se describen los valores de ConnectionString que se pueden usar para ello.

Nombre Valor predeterminado Descripción
Connection Lifetime 0 Cuando se devuelve una conexión a la agrupación, la hora de su creación se compara con la actual. La conexión se destruye cuando ese intervalo de tiempo (en segundos) supera el valor especificado para Connection Lifetime. Este sistema es muy útil en el caso de configuraciones agrupadas ya que permite equilibrar la carga entre un servidor que se está usando y otro que se ha puesto en conexión en este momento.

El valor cero (0) hace que las conexiones agrupadas tengan un tiempo de espera máximo.

Connection Reset 'true' Determina si la conexión a la base de datos se debe restablecer cuando se quita de la agrupación. En el caso de Microsoft SQL Server versión 7.0, el valor false evita tener que hacer un viaje adicional de ida y vuelta al servidor para obtener una conexión, aunque se debe tener en cuenta que no se restablece el estado de la conexión, por ejemplo el contexto de la base de datos.
Enlist 'true' Cuando tiene el valor true, el agrupador incluye automáticamente la conexión en el contexto de transacción actual del subproceso de creación, si hay un contexto de transacción.
Max Pool Size 100 Número máximo de conexiones permitidas en la agrupación.
Min Pool Size 0 Número mínimo de conexiones que se conservan en la agrupación.
Pooling 'true' Cuando tiene el valor true, la conexión se obtiene de la agrupación correspondiente o, si es necesario, se crea y se agrega a ella.

Contadores de rendimiento de la agrupación de conexiones

El proveedor de datos de .NET Framework para SQL Server agrega varios contadores de rendimiento que permiten ajustar con precisión las características de la agrupación de conexiones y detectar problemas intermitentes relacionados con intentos fallidos de conexión y problemas referentes a solicitudes efectuadas a SQL Server para las que se ha agotado el tiempo de espera.

En la tabla siguiente se enumeran los contadores de agrupación de conexiones que se pueden encontrar en el Monitor de sistema dentro del objeto de rendimiento ".NET CLR Data".

Contador Descripción
SqlClient: Current # of pooled and non pooled connections Número actual de conexiones agrupadas o no.
SqlClient: Current # pooled connections Número actual de conexiones existentes en todas las agrupaciones asociadas al proceso.
SqlClient: Current # connection pools Número actual de agrupaciones asociadas al proceso.
SqlClient: Peak # pooled connections Número máximo de conexiones existentes en todas las agrupaciones desde que se inició el proceso. Nota: este contador sólo está disponible cuando está asociado a una instancia específica del proceso. La instancia _Global devuelve en todos los casos el valor 0.
SqlClient: Total # failed connects Número total de intentos de apertura de conexión en los que se ha producido un error.

Nota   Al utilizar contadores de rendimiento del proveedor de datos de .NET Framework para SQL Server en combinación con aplicaciones ASP.NET, sólo está disponible la instancia _Global. Como resultado, el valor devuelto por el contador de rendimiento es la suma de los valores de los contadores de todas las aplicaciones ASP.NET.

Vea también

Conectar con un origen de datos mediante ADO.NET | Utilizar proveedores de datos .NET para obtener acceso a datos | SqlConnection (Clase)