Agrupación de conexiones (Controladores de Microsoft para PHP en SQL Server)

Descargar controlador PHP

Los siguientes puntos son importantes sobre la agrupación de conexiones en los controladores de Microsoft para PHP para SQL Server:

  • Los Controladores de Microsoft para PHP para SQL Server utilizan la agrupación de conexiones ODBC.

  • De forma predeterminada, la agrupación de conexiones está habilitada en Windows. En Linux y macOS, las conexiones solo se agrupan si la agrupación de conexiones está habilitada para ODBC (consulte Habilitación o deshabilitación de la agrupación de conexiones). Cuando la agrupación de conexiones está habilitada y se conecta a un servidor, el controlador intenta usar una conexión agrupada antes de crear una. Si no se encuentra una conexión equivalente en el grupo, se crea una nueva conexión y se agrega al grupo. El controlador determina si las conexiones son equivalentes según una comparación de las cadenas de conexión.

  • Cuando se utiliza una conexión del grupo, se restablece el estado de conexión (solo Windows).

  • Al cerrar la conexión, esta vuelve al grupo.

Para obtener más información sobre la agrupación de conexiones, consulte Agrupación de Conexiones del Gestor de Controladores.

Habilitación o deshabilitación de la agrupación de conexiones

Windows

Puede obligar al controlador a crear una nueva conexión en lugar de buscar una equivalente del grupo de conexiones estableciendo el valor del atributo ConnectionPooling en la cadena de conexión a false (o 0).

Si el atributo ConnectionPooling se omite de la cadena de conexión o si está establecido en true (o 1), el controlador solo crea una nueva conexión si no existe una conexión equivalente en el grupo de conexiones.

Nota

Conjuntos de resultados activos múltiples (MARS) está habilitado de forma predeterminada. Cuando MARS y el pooling están en uso, para que MARS funcione correctamente, el controlador requiere un tiempo más largo para restablecer la conexión en la primera consulta, ignorando así cualquier tiempo de espera de consulta especificado. Sin embargo, la configuración de tiempo de espera de consulta surte efecto en las consultas posteriores.

Si es necesario, consulte How to: Disable Multiple Active Resultsets (MARS). Para obtener información sobre otros atributos de conexión, consulte Connection Options.

Linux y macOS

El atributo ConnectionPooling no se puede usar para habilitar ni deshabilitar la agrupación de conexiones.

La agrupación de conexiones se puede habilitar o deshabilitar editando el archivo de configuración de odbcinst.ini. Se debe volver a cargar el controlador para que los cambios surtan efecto.

Si se establece Pooling en Yes y un valor de CPTimeout positivo en el archivo odbcinst.ini, se habilita la agrupación de conexiones.

[ODBC]
Pooling=Yes

[ODBC Driver 17 for SQL Server]
CPTimeout=<int value>

Como mínimo, el archivo odbcinst.ini debe tener un aspecto similar al del ejemplo siguiente:

[ODBC]
Pooling=Yes

[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.5.so.2.1
UsageCount=1
CPTimeout=120

Al establecer Pooling en No en el archivo odbcinst.ini se obliga al controlador a crear una conexión.

[ODBC]
Pooling=No

Observaciones

  • En Linux o macOS, no se recomienda la agrupación de conexiones con versiones de unixODBC anteriores a la 2.3.7. Todas las conexiones se agruparán si está habilitada la agrupación en el archivo odbcinst.ini, lo que significa que la opción de conexión ConnectionPooling no tiene ningún efecto. Para deshabilitar la agrupación, establezca Pooling=No en el archivo odbcinst.ini y vuelva a cargar los controladores.

    • unixODBC <= 2.3.4 (Linux y macOS) podría no devolver información de diagnóstico adecuada, como mensajes de error, advertencias e mensajes informativos.
    • Por este motivo, es posible que los controladores SQLSRV y PDO_SQLSRV no puedan capturar correctamente datos largos (como xml, binarios) como cadenas. Como solución temporal, los datos largos se pueden capturar como secuencias. Consulte el ejemplo siguiente para SQLSRV.
  • Al usar AccessToken con la agrupación de conexiones, el controlador anexa un hash del contenido del token a la APP palabra clave de conexión para asegurarse de que las conexiones con tokens de acceso diferentes no se agrupan. Esto evita la contaminación cruzada de identidades en la que una conexión agrupada autenticada como una identidad podría reutilizarse para una identidad diferente. Los datos de token se almacenan en caché con la expiración basada en TTL para garantizar la estabilidad del puntero para el controlador ODBC. Este comportamiento se introdujo en la versión 5.13.1.

<?php
$connectionInfo = array("Database"=>"test", "UID"=>"username", "PWD"=>"password");

$conn1 = sqlsrv_connect("servername", $connectionInfo);

$longSample = str_repeat("a", 8500);
$xml1 = 
'<ParentXMLTag>
  <ChildTag01>'.$longSample.'</ChildTag01>
</ParentXMLTag>';

// Create table and insert xml string into it
sqlsrv_query($conn1, "CREATE TABLE xml_table (field xml)");
sqlsrv_query($conn1, "INSERT into xml_table values ('$xml1')");

// retrieve the inserted xml
$column1 = getColumn($conn1);

// return the connection to the pool
sqlsrv_close($conn1);

// This connection is from the pool
$conn2 = sqlsrv_connect("servername", $connectionInfo);
$column2 = getColumn($conn2);

sqlsrv_query($conn2, "DROP TABLE xml_table");
sqlsrv_close($conn2);

function getColumn($conn)
{
    $tsql = "SELECT * from xml_table";
    $stmt = sqlsrv_query($conn, $tsql);
    sqlsrv_fetch($stmt);
    // This might fail in Linux and macOS
    // $column = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR));
    // The workaround is to fetch it as a stream
    $column = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR));
    sqlsrv_free_stmt($stmt);
    return ($column);
}
?>