Agrupación de conexiones de administrador de controladores

La agrupación de conexiones permite a una aplicación usar una conexión desde un grupo de conexiones que no es necesario volver a establecer para cada uso. Una vez creada y colocada una conexión en un grupo, una aplicación puede reutilizar esa conexión sin realizar el proceso de conexión completo.

El uso de una conexión agrupada puede dar lugar a importantes mejoras de rendimiento, ya que las aplicaciones pueden ahorrar la sobrecarga implicada en realizar una conexión. Esto puede ser especialmente significativo para las aplicaciones de nivel intermedio que se conectan a través de una red o para las aplicaciones que se conectan y desconectan repetidamente, como las aplicaciones de Internet.

Además de las mejoras de rendimiento, la arquitectura de agrupación de conexiones permite que varios componentes usen un entorno y sus conexiones asociadas en un único proceso. Esto significa que los componentes independientes del mismo proceso pueden interactuar entre sí sin tener en cuenta los demás. Varios componentes pueden usar repetidamente una conexión en un grupo de conexiones.

Nota:

Una aplicación ODBC que muestra ODBC 2 puede usar la agrupación de conexiones. Comportamiento x, siempre que la aplicación pueda llamar a SQLSetEnvAttr. Al usar la agrupación de conexiones, la aplicación no debe ejecutar instrucciones SQL que cambien la base de datos o el contexto de la base de datos, como cambiar el <nombre de la base de datos>, que cambia el catálogo usado por un origen de datos.

Un controlador ODBC debe ser totalmente seguro para subprocesos y las conexiones no deben tener afinidad de subprocesos para admitir la agrupación de conexiones. Esto significa que el controlador puede controlar una llamada en cualquier subproceso en cualquier momento y puede conectarse en un subproceso, usar la conexión en otro subproceso y desconectar en un tercer subproceso.

El Administrador de controladores mantiene el grupo de conexiones. Las conexiones se extraen del grupo cuando la aplicación llama a SQLConnect o SQLDriverConnect y se devuelven al grupo cuando la aplicación llama a SQLDisconnect. El tamaño del grupo crece dinámicamente, en función de las asignaciones de recursos solicitadas. Se reduce en función del tiempo de espera de inactividad: si una conexión está inactiva durante un período de tiempo (no se ha usado en una conexión), se quita del grupo. El tamaño del grupo solo está limitado por restricciones de memoria y límites en el servidor.

El Administrador de controladores determina si se debe usar una conexión específica en un grupo según los argumentos pasados en SQLConnect o SQLDriverConnect, y según los atributos de conexión establecidos después de asignar la conexión.

Cuando el Administrador de controladores está agrupando conexiones, debe poder determinar si una conexión sigue funcionando antes de entregar la conexión. De lo contrario, el Administrador de controladores sigue entregando la conexión inactiva a la aplicación siempre que se produzca un error de red transitorio. Se ha definido un nuevo atributo de conexión en ODBC 3*.x*: SQL_ATTR_CONNECTION_DEAD. Se trata de un atributo de conexión de solo lectura que devuelve SQL_CD_TRUE o SQL_CD_FALSE. El valor SQL_CD_TRUE significa que se ha perdido la conexión, mientras que el valor SQL_CD_FALSE significa que la conexión sigue activa. (Los controladores que se ajustan a versiones anteriores de ODBC también pueden admitir este atributo).

Un controlador debe implementar esta opción de forma eficaz o afectará al rendimiento de la agrupación de conexiones. En concreto, una llamada para obtener este atributo de conexión no debe provocar un recorrido de ida y vuelta al servidor. En su lugar, un controlador solo debe devolver el último estado conocido de la conexión. La conexión está inactiva si se produjo un error en el último viaje al servidor y no está inactiva si el último viaje se realizó correctamente.

Comentarios

Si se ha perdido una conexión (notificada a través de SQL_ATTR_CONNECTION_DEAD), el Administrador de controladores ODBC destruirá esa conexión llamando a SQLDisconnect en el controlador. Es posible que las nuevas solicitudes de conexión no encuentren una conexión utilizable en el grupo. Finalmente, el Administrador de controladores podría realizar una nueva conexión, suponiendo que el grupo está vacío.

Para usar un grupo de conexiones, una aplicación realiza los pasos siguientes:

  1. Habilita la agrupación de conexiones mediante una llamada a SQLSetEnvAttr para establecer el atributo de entorno de SQL_ATTR_CONNECTION_POOLING en SQL_CP_ONE_PER_DRIVER o SQL_CP_ONE_PER_HENV. Esta llamada debe realizarse antes de que la aplicación asigne el entorno compartido para el que se va a habilitar la agrupación de conexiones. El identificador de entorno de la llamada a SQLSetEnvAttr debe establecerse en NULL, lo que convierte SQL_ATTR_CONNECTION_POOLING en un atributo de nivel de proceso. Si el atributo se establece en SQL_CP_ONE_PER_DRIVER, se admite un único grupo de conexiones para cada controlador. Si una aplicación funciona con muchos controladores y pocos entornos, esto puede ser más eficaz, ya que es posible que se necesiten menos comparaciones. Si se establece en SQL_CP_ONE_PER_HENV, se admite un único grupo de conexiones para cada entorno. Si una aplicación funciona con muchos entornos y pocos controladores, esto puede ser más eficaz, ya que es posible que se necesiten menos comparaciones. La agrupación de conexiones está deshabilitada estableciendo SQL_ATTR_CONNECTION_POOLING en SQL_CP_OFF.

  2. Asigna un entorno llamando a SQLAllocHandle con el argumento HandleType establecido en SQL_HANDLE_ENV. El entorno asignado por esta llamada será un entorno compartido implícito porque se ha habilitado la agrupación de conexiones. El entorno que se va a usar no se determina, sin embargo, hasta que se llama a SQLAllocHandle con un argumento HandleType de SQL_HANDLE_DBC en este entorno.

  3. Asigna una conexión llamando a SQLAllocHandle con InputHandle establecido en SQL_HANDLE_DBC y InputHandle establecido en el identificador de entorno asignado para la agrupación de conexiones. El Administrador de controladores intenta encontrar un entorno existente que coincida con los atributos de entorno establecidos por la aplicación. Si no existe este entorno, se crea uno, con un recuento de referencias (mantenido por el Administrador de controladores) de 1. Si se encuentra un entorno compartido coincidente, se devuelve el entorno a la aplicación y se incrementa su recuento de referencias. (El Administrador de controladores no determina la conexión real que se va a usar hasta que se llama a SQLConnect o SQLDriverConnect).

  4. Llama a SQLConnect o SQLDriverConnect para realizar la conexión. El Administrador de controladores usa las opciones de conexión de la llamada a SQLConnect (o las palabras clave de conexión de la llamada a SQLDriverConnect) y los atributos de conexión establecidos después de la asignación de conexión para determinar qué conexión del grupo se debe usar.

    Nota:

    La coincidencia de una conexión solicitada con una conexión agrupada viene determinada por el atributo de entorno SQL_ATTR_CP_MATCH. Para obtener más información, vea SQLSetEnvAttr.

    Las aplicaciones ODBC que usan la agrupación de conexiones deben llamar a CoInitializeEx durante la inicialización de la aplicación y CoUninitialize cuando se cierra la aplicación.

  5. Llama a SQLDisconnect cuando termina con la conexión. La conexión se devuelve al grupo de conexiones y está disponible para su reutilización.

Para obtener una explicación detallada, consulte Agrupación en los componentes de Microsoft Data Access.

Consideraciones sobre la agrupación de conexiones

La realización de cualquiera de las siguientes acciones mediante un comando SQL (en lugar de a través de la API ODBC) puede afectar al estado de la conexión y provocar problemas inesperados al activar la agrupación de conexiones:

  • Apertura de una conexión y cambio de la base de datos predeterminada.

  • Uso de la instrucción SET para cambiar las opciones configurables (incluidos SET ROWCOUNT, ANSI_NULL, IMPLICIT_TRANSACTIONS, SHOWPLAN, STATISTICS, TEXTSIZE y DATEFORMAT).

  • Creación de tablas temporales y procedimientos almacenados.

Si alguna de estas acciones se realiza fuera de la API ODBC, la siguiente persona que usa la conexión heredará automáticamente la configuración, las tablas o los procedimientos anteriores.

Nota:

No espere que ciertas configuraciones estén presentes en el estado de conexión. Siempre debe establecer el estado de conexión en la aplicación y asegurarse de que la aplicación quita cualquier configuración de agrupación de conexiones sin usar.

Agrupación de conexiones dependientes del controlador

A partir de Windows 8, un controlador ODBC puede usar conexiones en el grupo de forma más eficaz. Para obtener más información, vea Agrupación de conexiones dependientes del controlador.

Consulte también

Conectarse a datos de un origen o el controlador
Desarrollar un controlador ODBC
Agrupación en los componentes de Microsoft Data Access