Desarrollar el conocimiento de la agrupación de conexiones en un controlador ODBC

En este tema se describen los detalles del desarrollo de un controlador ODBC que contiene información sobre cómo el controlador debe proporcionar servicios de agrupación de conexiones.

Habilitación de agrupación de conexiones dependientes del controlador

Un controlador debe implementar las siguientes funciones de Interfaz del proveedor de servicios ODBC (SPI):

  • SQLSetConnectAttrForDbcInfo

  • SQLSetConnectInfo

  • SQLSetDriverConnectInfo

  • SQLGetPoolID

  • SQLRateConnection

  • SQLPoolConnect

  • SQLCleanupConnectionPoolID

Consulte Referencia de la interfaz del proveedor de servicios ODBC (SPI) para obtener más información.

Un controlador también debe implementar las siguientes funciones existentes para que se pueda habilitar la agrupación compatible con controladores:

Función Funcionalidad agregada
SQLAllocHandle

SQLFreeHandle

SQLGetDiagField

SQLGetDiagRec
Admitir el nuevo tipo de identificador: SQL_HANDLE_DBC_INFO_TOKEN (consulte la descripción siguiente).
SQLSetConnectAttr Admitir el nuevo atributo de conexión de solo conjunto: SQL_ATTR_DBC_INFO_TOKEN para restablecer la conexión (consulte la descripción siguiente).

Nota:

No se admiten funciones en desuso como SQLError y SQLSetConnectOption para la agrupación de conexiones compatibles con controladores.

El identificador del grupo

El identificador del grupo es un identificador específico del controlador de longitud de puntero para representar un grupo determinado de conexiones que se pueden usar indistintamente. Dado un conjunto de información de conexión, un controlador debe poder deducir rápidamente el identificador de grupo correspondiente.

Por ejemplo, el identificador del grupo debe codificar el nombre del servidor y la información de credenciales. Sin embargo, el nombre de la base de datos no es necesario porque un controlador puede reutilizar una conexión y, a continuación, cambiar la base de datos en menos tiempo que realizar una nueva conexión.

Un controlador debe definir un conjunto de atributos clave, que incluirá el identificador del grupo. El valor de estos atributos clave puede proceder de atributos de conexión, cadena de conexión y DSN. En caso de que haya conflictos en estos orígenes, se debe usar la directiva de resolución específica del controlador existente para la compatibilidad con versiones anteriores.

El Administrador de controladores usará un grupo diferente para diferentes identificadores de grupo. Todas las conexiones del mismo grupo son reutilizables. El Administrador de controladores nunca volverá a usar una conexión con un identificador de grupo diferente.

Por lo tanto, los controladores deben asignar un identificador de grupo único para cada grupo de conexiones con el mismo valor en sus atributos clave definidos. Si un controlador usa el mismo identificador de grupo para dos conexiones con valores diferentes en sus atributos clave, el Administrador de controladores los seguirá colocando en el mismo grupo (el Administrador de controladores no sabe nada sobre los atributos de clave específicos del controlador). Esto significa que el controlador tendrá que informar al Administrador de controladores de que una conexión con un conjunto diferente de atributos de clave no se puede reutilizar dentro de la función SQLRateConnection. Esto puede reducir el rendimiento y no se recomienda.

El Administrador de controladores no reutilizará una conexión asignada desde otro entorno de controlador, incluso si toda la información de conexión coincide. El Administrador de controladores usará un grupo diferente para un entorno diferente, incluso cuando las conexiones tengan el mismo identificador de grupo. Por lo tanto, el identificador del grupo es local para su entorno de controlador.

La función para obtener el identificador del grupo del controlador es la SQLGetPoolID.

Clasificación de conexión

En comparación con el establecimiento de una nueva conexión, puede obtener un mejor rendimiento restableciendo cierta información de conexión (como DATABASE) en una conexión agrupada. Por lo tanto, es posible que no quiera que el nombre de la base de datos esté en el conjunto de atributos clave. De lo contrario, puede tener un grupo independiente para cada base de datos, eso puede no ser buena idea en las aplicaciones de nivel medio, donde los clientes usan varias cadenas de conexión diferentes.

Siempre que vuelva a usar una conexión que tenga algún error de coincidencia de atributos, debe restablecer los atributos no coincidentes en función de la nueva solicitud de aplicación, de modo que la conexión devuelta sea idéntica a la solicitud de aplicación (vea la explicación del atributo SQL_ATTR_DBC_INFO_TOKEN en la función SQLSetConnectAttr). Sin embargo, restablecer esos atributos puede reducir el rendimiento. Por ejemplo, restablecer una base de datos requiere una llamada de red al servidor. Por lo tanto, vuelva a usar una conexión que coincida perfectamente, si hay una disponible.

Una función de clasificación en el controlador puede evaluar una conexión existente con una nueva solicitud de conexión. Por ejemplo, la función de clasificación del controlador puede determinar:

  • Si la conexión existente coincide perfectamente con la solicitud.

  • Si solo hay algunas discrepancias insignificantes, como el tiempo de espera de conexión, que no requieren que la comunicación con el servidor se restablezca.

  • Si hay algunos atributos no coincidentes que requieren que se restablezca una comunicación con el servidor, pero seguiría teniendo un mejor rendimiento que establecer una nueva conexión.

  • Si se produjo un error de coincidencia para un atributo que tarda mucho tiempo en restablecerse (el desarrollador del controlador puede considerar la posibilidad de agregar este atributo al conjunto de atributos clave, que se usa para generar el identificador del grupo).

Una puntuación entre 0 y 100 es posible, donde 0 significa no reutilizar y 100 significa coincidencia perfecta. SQLRateConnection es la función para clasificar una conexión.

Nuevo identificador ODBC: SQL_HANDLE_DBC_INFO_TOKEN

Para admitir la agrupación de conexiones compatibles con controladores, el controlador necesita información de conexión para calcular el identificador del grupo. El controlador también necesita información de conexión para comparar las nuevas solicitudes de conexión con las conexiones del grupo. Siempre que no se pueda reutilizar ninguna conexión en el grupo, el controlador tiene que establecer una nueva conexión, por lo que requiere información de conexión.

Dado que la información de conexión puede proceder de varios orígenes (cadena de conexión, atributos de conexión y DSN), es posible que el controlador tenga que analizar la cadena de conexión y resolver el conflicto entre estos orígenes en cada una de las llamadas de función anteriores.

Por lo tanto, se introduce un nuevo identificador ODBC: SQL_HANDLE_DBC_INFO_TOKEN. Con SQL_HANDLE_DBC_INFO_TOKEN, un controlador no necesita analizar la cadena de conexión y resolver conflictos en la información de conexión más de una vez. Dado que se trata de una estructura de datos específica del controlador, el controlador puede almacenar datos como la información de conexión o el identificador del grupo.

Este identificador solo se usa como una interfaz entre el Administrador de controladores y el controlador. Una aplicación no puede asignar este identificador directamente.

El identificador primario de este identificador es de tipo SQL_HANDLE_ENV, lo que significa que el controlador puede obtener la información del entorno del identificador HENV durante la resolución de información de conexión.

Cada vez que recibe una nueva solicitud de conexión, el Administrador de controladores asignará un identificador de tipo SQL_HANDLE_DBC_INFO_TOKEN para almacenar información de conexión, después de confirmar que el controlador admite el reconocimiento del grupo de conexiones. Cuando termine de usar el identificador (pero antes de devolver algunos códigos de retorno distintos de SQL_STILL_EXECUTING de SQLDriverConnect o SQLConnect), el Administrador de controladores liberará el identificador. Por lo tanto, el identificador se crea después de la llamada SQLAllocHandle y se destruye después de la llamada a SQLFreeHandle. El Administrador de controladores garantiza que el identificador se liberará antes de liberar su HENV asociado (cuando SQLDriverConnect o SQLConnect devuelve un error).

El controlador debe modificar las siguientes funciones para aceptar el nuevo tipo de identificador SQL_HANDLE_DBC_INFO_TOKEN:

  1. SQLAllocHandle

  2. SQLFreeHandle

  3. SQLGetDiagField

  4. SQLGetDiagRec

El Administrador de controladores garantiza que varios subprocesos no usarán el mismo identificador SQL_HANDLE_DBC_INFO_TOKEN simultáneamente. Por lo tanto, el modelo de sincronización de este controlador puede ser muy sencillo dentro del controlador. El Administrador de controladores no tomará un bloqueo de entorno antes de asignar y liberar SQL_HANDLE_DBC_INFO_TOKEN.

SQLAllocHandle y SQLFreeHandle del Administrador de controladores no aceptarán este nuevo tipo de identificador.

SQL_HANDLE_DBC_INFO_TOKEN puede contener información confidencial, como las credenciales. Por lo tanto, un controlador debe borrar de forma segura el búfer de memoria (mediante SecureZeroMemory) que contiene la información confidencial antes de liberar este identificador con SQLFreeHandle. Siempre que se cierre el identificador de entorno de una aplicación, se cerrarán todos los grupos de conexiones asociados.

Algoritmo de clasificación del grupo de conexiones del Administrador de controladores

En esta sección se describe el algoritmo de clasificación para la agrupación de conexiones del Administrador de controladores. Los desarrolladores de controladores pueden implementar el mismo algoritmo para la compatibilidad con versiones anteriores. Este algoritmo puede que no sea el mejor. Debe refinar este algoritmo en función de la implementación (de lo contrario, no hay ninguna razón para implementar esta característica).

El Administrador de controladores devolverá una clasificación integral de 0 a 100 para cada conexión del grupo. Un 0 significa que la conexión no se puede reutilizar y 100 indica una coincidencia perfecta. Supongamos que la solicitud de conexión se denomina hRequest y que la conexión existente del grupo se denomina hCandidate. Si alguna de las condiciones siguientes es falsa, la conexión agrupada hCandidate no se puede reutilizar para hRequest (el Administrador de controladores asignará una clasificación de 0).

  • hCandidate y hRequest proceden de la API UNICODE (como SQLDriverConnectW) o de la API ANSI (como SQLDriverConnectA). (Los controladores UNICODE pueden tener un comportamiento diferente según la API ANSI y la API UNICODE (consulte el atributo de conexión SQL_ATTR_ANSI_APP)).

  • hCandidate y hRequest se crean mediante la misma función; SQLDriverConnect o SQLConnect.

  • La cadena de conexión usada para abrir hCandidate debe ser la misma que hRequest, cuando se usa SQLDriverConnect.

  • El ServerName (o DSN), nombre de usuario y contraseña que se usa para abrir hCandidate debe ser el mismo que se usa para abrir hRequest cuando se usa SQLConnect.

  • El identificador de seguridad (SID) del subproceso actual debe ser el mismo que el SID usado para abrir hCandidate.

  • Para un controlador que es costoso de inscribir y de anular la inscripción (consulte la explicación de SQL_DTC_TRANSITION_COST en SQLConnect), la reutilización de hRequest no debe requerir una inscripción adicional o una anulación de la inscripción.

En la tabla siguiente se muestra la asignación de puntuación para distintos escenarios.

Comparación de atributos de conexión entre la conexión agrupada y la solicitud Sin inscripción o anulación de la inscripción Requerir inscripción adicional/anulación de la inscripción
El catálogo (SQL_ATTR_CURRENT_CATALOG) es diferente 60 50
Algunos atributos de conexión son diferentes, pero el catálogo es el mismo 90 70
Todos los atributos de conexión coinciden perfectamente 100 80

Diagrama de secuencia

En este diagrama de secuencia se muestra el mecanismo de agrupación básico descrito en este tema. Solo muestra el uso de SQLDriverConnect, pero el caso de SQLConnect es similar.

Sequence Diagram

Diagrama de estado

En este diagrama de estado se muestra el objeto de token de información de conexión, que se describe en este tema. El diagrama solo muestra SQLDriverConnect, pero el caso de SQLConnect es similar. Dado que el Administrador de controladores puede necesitar controlar errores en cualquier momento, el Administrador de controladores puede llamar a SQLFreeHandle para cualquier estado.

State Diagram

Consulte también

Agrupación de conexiones dependientes del controlador
Referencia de la interfaz del proveedor de servicios (SPI) de ODBC